linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 ,。。谢谢

linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 ,。。谢谢,第1张

简单的:

//client

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/stat.h>

#include <sys/mman.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <arpa/inet.h>

#define ERR() \

do { perror("")printf("%d -- func: %s\n", __LINE__, __FUNCTION__)return -1} while(0)

int main (int argc, char *argv[])

{

int sockfd, fd, nbytes

struct sockaddr_in addr

struct stat f_stat

if (argc <3) {

ERR()

}

fd = open (argv[2], O_RDONLY)

if (fd == -1) {

ERR()

}

sockfd = socket (AF_INET, SOCK_DGRAM, 0)

if (sockfd == -1) {

ERR()

}

addr.sin_family = AF_INET

addr.sin_port = htons (5678)

inet_aton (argv[1], &addr.sin_addr)

if (-1 == lstat (argv[2], &f_stat) ) {

ERR()

}

char *buff = (char *) mmap (NULL, f_stat.st_size, PROT_READ, MAP_SHARED, fd, 0)

nbytes = sendto (sockfd, (void *) buff, f_stat.st_size, 0, (struct sockaddr *) &addr, (socklen_t) sizeof (addr) )

if (nbytes == -1) {

ERR()

}

munmap (buff, f_stat.st_size)

close (fd)

return 0

}

===================================

//server

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/stat.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <arpa/inet.h>

#define SIZE 512

#define ERR() \

do { perror("")printf("%d -- func: %s\n", __LINE__, __FUNCTION__)return -1} while(0)

int main (void)

{

int sockfd, fd, nbytes, ret

socklen_t addr_len

char buff[SIZE]

struct sockaddr_in addr

sockfd = socket (AF_INET, SOCK_DGRAM, 0)

if (sockfd == -1) {

ERR()

}

memset ( (void *) &addr, 0, sizeof (addr) )

addr.sin_family = AF_INET

addr.sin_port = htons (5678)

addr.sin_addr.s_addr = htonl (INADDR_ANY)

addr_len = sizeof (addr)

ret = bind (sockfd, (const struct sockaddr *) &addr, addr_len)

if (ret == -1) {

ERR()

}

printf ("#### Waiting For Data ... ####\n")

fd = creat ("recv", S_IWUSR | S_IRUSR)

nbytes = recvfrom (sockfd, (void *) buff, SIZE, 0, (struct sockaddr *) &addr, (socklen_t *) &addr_len)

if (nbytes == -1) {

ERR()

}

write (fd, (void *) buff, nbytes)

close (fd)

return 0

}

server:

#include <stdio.h>

#include <errno.h>

#include <unistd.h>

#include <signal.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <syslog.h>

#include <sys/time.h>

#include <string.h>

#include <fcntl.h>

#include <sys/wait.h>

#define MAXDATASIZE 1024

#define SERVPORT 19999

#define BACKLOG 10

int SendFileToServ(const char *path, const char *FileName, const char *ip)

{

#define PORT 20002

int sockfd

int recvbytes

char buf[MAXDATASIZE]

char send_str[MAXDATASIZE]

char filepath[128] = {0}

struct sockaddr_in serv_addr

FILE *fp

sprintf(filepath, "%s%s", path, FileName)

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("socket")

return 1

}

bzero(&serv_addr,sizeof(struct sockaddr_in))

serv_addr.sin_family=AF_INET

serv_addr.sin_port=htons(PORT)

inet_aton(ip, &serv_addr.sin_addr)

int IErrCount = 0

again:

if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)

{

if (5 == IErrCount)

return 1

IErrCount++

perror("connect")

sleep(2)

goto again

}

//if ((fp = fopen(FileName, "rb")) == NULL)

if ((fp = fopen(filepath, "rb")) == NULL)

{

perror("fopen ")

return 1

}

recvbytes = write(sockfd, FileName, strlen(FileName))

recvbytes = read(sockfd, buf, MAXDATASIZE)

if (!memcmp(buf, "sendmsg", 7))

{

while(fgets(send_str, MAXDATASIZE, fp))

{

recvbytes = write(sockfd, send_str, strlen(send_str))

recvbytes = read(sockfd, buf, MAXDATASIZE)

if (recvbytes <= 0)

{

fclose(fp)

close(sockfd)

return 1

}

if (memcmp(buf, "goon", 4))

{

fclose(fp)

close(sockfd)

return 1

}

}

recvbytes = write(sockfd, "end", 3)

}

else

{

fclose(fp)

close(sockfd)

return 1

}

memset(buf, 0, MAXDATASIZE)

if (read(sockfd, buf, MAXDATASIZE) <= 0)

{

close(sockfd)

return 2

}

char *Eptr = "nginx reload error"

//printf("bf[%s]\n", buf)

int ret

ret = strncmp(buf, Eptr, strlen(Eptr))

//printf("%d\n", ret)

if (!ret)

{

close(sockfd)

return 2

}

close(sockfd)

return 0

}

int mysyslog(const char * msg)

{

FILE *fp

if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)

{

return 0

}

fprintf(fp, "[%s]\n", msg)

fclose(fp)

return 0

}

static void quit_handler(int signal)

{

kill(0, SIGUSR2)

syslog( LOG_NOTICE, "apuserv quit...")

// do something exit thing ,such as close socket ,close mysql,free list

// .....

//i end

exit(0)

}

static int re_conf = 0

static void reconf_handler(int signal)

{

re_conf=1

syslog(LOG_NOTICE,"apuserv reload configure file .")

// 请在循环体中判断,如果re_conf == 1,请再次加载配置文件。

}

static int isrunning(void)

{

int fd

int ret

struct flock lock

lock.l_type = F_WRLCK

lock.l_whence = 0

lock.l_start = 0

lock.l_len = 0

const char *lckfile = "/tmp/apuserv.lock"

fd = open(lckfile,O_WRONLY|O_CREAT)

if (fd <0) {

syslog(LOG_ERR,"can not create lock file: %s\n",lckfile)

return 1

}

if ((ret = fcntl(fd,F_SETLK,&lock)) <0) {

ret = fcntl(fd,F_GETLK,&lock)

if (lock.l_type != F_UNLCK) {

close(fd)

return lock.l_pid

}

else {

fcntl(fd,F_SETLK,&lock)

}

}

return 0

}

int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)

{

sscanf(buf, "%s %s %s", pth, FileName, str)

printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str)

return 0

}

int main(int argc, char **argv)

{

int sockfd,client_fd

socklen_t sin_size

struct sockaddr_in my_addr,remote_addr

char buff[MAXDATASIZE]

int recvbytes

#if 1

int pid

char ch

int ret

int debug = 0

signal(SIGUSR1, SIG_IGN)

signal(SIGUSR2, SIG_IGN)

signal(SIGHUP, SIG_IGN)

signal(SIGTERM, quit_handler)

syslog(LOG_NOTICE,"apuserver start....")

while ((ch = getopt(argc, argv, "dhV")) != -1) {

switch (ch) {

case 'd':

debug = 1

break

case 'V':

printf("Version:%s\n","1.0.0")

return 0

case 'h':

printf(" -d use daemon mode\n")

printf(" -V show version\n")

return 0

default:

printf(" -d use daemon mode\n")

printf(" -V show version\n")

}

}

if (debug &&daemon(0,0 ) ) {

return -1

}

if (isrunning()) {

fprintf(stderr, "apuserv is already running\n")

syslog(LOG_INFO,"apuserv is already running\n")

exit(0)

}

while (1) {

pid = fork()

if (pid <0)

return -1

if (pid == 0)

break

while ((ret = waitpid(pid, NULL, 0)) != pid) {

syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret)

if (ret <0)

syslog(LOG_NOTICE, "waitpid errno:%d", errno)

}

kill(0, SIGUSR2)

sleep(1)

syslog(LOG_NOTICE,"restart apuserver")

}

signal(SIGHUP, reconf_handler)

signal(SIGPIPE, SIG_IGN)

signal(SIGUSR1,SIG_IGN)

signal(SIGUSR2, SIG_DFL)

signal(SIGTERM, SIG_DFL)

#endif

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("socket")

exit(1)

}

bzero(&my_addr,sizeof(struct sockaddr_in))

my_addr.sin_family=AF_INET

my_addr.sin_port=htons(SERVPORT)

my_addr.sin_addr.s_addr = htonl(INADDR_ANY)

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)

{

perror("bind")

exit(1)

}

if(listen(sockfd,BACKLOG)==-1)

{

perror("listen")

exit(1)

}

int nret

while(1)

{

sin_size = sizeof(struct sockaddr_in)

if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)

{

perror("falied accept")

continue

}

memset(buff, 0, MAXDATASIZE)

recvbytes = read(client_fd, buff, MAXDATASIZE)

char str[16] = {0}

char FileName[128] = {0}

char path[128] = {0}

MyHandleBuff(buff, str, FileName, path)

if (recvbytes >0)

{

nret = SendFileToServ(path, FileName, str)

printf("nret[%d]\n", nret)

if (1 == nret)

write(client_fd, "send file error", 15)

else if(2 == nret)

write(client_fd, "reload nginx error", 18)

else

write(client_fd, "succ", 4)

}

close(client_fd)

}

}

_________________________________________________

client:

#include <stdio.h>

#include <errno.h>

#include <unistd.h>

#include <signal.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <syslog.h>

#include <sys/time.h>

#include <string.h>

#include <fcntl.h>

#include <sys/wait.h>

#define MAXDATASIZE 1024

#define SERVPORT 20002

#define BACKLOG 10

int mysyslog(const char * msg)

{

FILE *fp

if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)

{

return 0

}

fprintf(fp, "[%s]\n", msg)

fclose(fp)

return 0

}

static void quit_handler(int signal)

{

kill(0, SIGUSR2)

syslog( LOG_NOTICE, "apuserv quit...")

// do something exit thing ,such as close socket ,close mysql,free list

// .....

//i end

exit(0)

}

static int re_conf = 0

static void reconf_handler(int signal)

{

re_conf=1

syslog(LOG_NOTICE,"apuserv reload configure file .")

// ????·???????1nf == 1£???′μ?????

static int isrunning(void)

{

int fd

int ret

struct flock lock

lock.l_type = F_WRLCK

lock.l_whence = 0

lock.l_start = 0

lock.l_len = 0

const char *lckfile = "/tmp/dstserver.lock"

fd = open(lckfile,O_WRONLY|O_CREAT)

if (fd <0) {

syslog(LOG_ERR,"can not create lock file: %s\n",lckfile)

return 1

}

if ((ret = fcntl(fd,F_SETLK,&lock)) <0) {

ret = fcntl(fd,F_GETLK,&lock)

if (lock.l_type != F_UNLCK) {

close(fd)

return lock.l_pid

}

else {

fcntl(fd,F_SETLK,&lock)

}

}

return 0

}

int main(int argc, char **argv)

{

int sockfd,client_fd

socklen_t sin_size

struct sockaddr_in my_addr,remote_addr

char buff[MAXDATASIZE]

int recvbytes

#if 1

int pid

char ch

int ret

int debug = 0

signal(SIGUSR1, SIG_IGN)

signal(SIGUSR2, SIG_IGN)

signal(SIGHUP, SIG_IGN)

signal(SIGTERM, quit_handler)

syslog(LOG_NOTICE,"dstserver start....")

while ((ch = getopt(argc, argv, "dhV")) != -1) {

switch (ch) {

case 'd':

debug = 1

break

case 'V':

printf("Version:%s\n","1.0.0")

return 0

case 'h':

printf(" -d use daemon mode\n")

printf(" -V show version\n")

return 0

default:

printf(" -d use daemon mode\n")

printf(" -V show version\n")

}

}

if (debug &&daemon(0,0 ) ) {

return -1

}

if (isrunning()) {

fprintf(stderr, "dstserver is already running\n")

syslog(LOG_INFO,"dstserver is already running\n")

exit(0)

}

while (1) {

pid = fork()

if (pid <0)

return -1

if (pid == 0)

break

while ((ret = waitpid(pid, NULL, 0)) != pid) {

syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret)

if (ret <0)

syslog(LOG_NOTICE, "waitpid errno:%d", errno)

}

kill(0, SIGUSR2)

sleep(1)

syslog(LOG_NOTICE,"restart apuserver")

}

signal(SIGHUP, reconf_handler)

signal(SIGPIPE, SIG_IGN)

signal(SIGUSR1,SIG_IGN)

signal(SIGUSR2, SIG_DFL)

signal(SIGTERM, SIG_DFL)

#endif

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("socket")

exit(1)

}

bzero(&my_addr,sizeof(struct sockaddr_in))

my_addr.sin_family=AF_INET

my_addr.sin_port=htons(SERVPORT)

my_addr.sin_addr.s_addr = htonl(INADDR_ANY)

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)

{

perror("bind")

exit(1)

}

if(listen(sockfd,BACKLOG)==-1)

{

perror("listen")

exit(1)

}

char filepath[MAXDATASIZE]= {0}

FILE *fp

while(1)

{

sin_size = sizeof(struct sockaddr_in)

if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)

{

perror("falied accept")

continue

}

memset(buff, 0, MAXDATASIZE)

recvbytes = read(client_fd, buff, MAXDATASIZE)

sprintf(filepath, "/etc/nginx/url_rule/%s", buff)

if ((fp = fopen(filepath, "wb")) == NULL)

{

perror("fopen")

close(client_fd)

continue

}

write(client_fd, "sendmsg", 7)

while(read(client_fd, buff, MAXDATASIZE))

{

if (!memcmp(buff, "end", 3))

{

fclose(fp)

break

}

else

{

fprintf(fp, "%s", buff)

write(client_fd, "goon", 4)

}

}

//system("nginx -s reload")

char *Sptr = "nginx reload succ"

char *Eptr = "nginx reload error"

int ret

ret = system("nginx -s reload")

printf("ret[%d]\n", ret)

if (ret != 0)

{

write(client_fd, Eptr, strlen(Eptr))

}

else

{

write(client_fd, Sptr, strlen(Sptr))

}

close(client_fd)

}

}

以前写的:内容忘记了。不是很复杂你可以自己看!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8601095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存