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

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

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)

}

}

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

只是做这些动作的话不需要多线程

找了下以前写的 改成了你说的10次发送

client.c:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

int main(int argc,char **argv)

{

char wbuf[] = "hello server"

char rbuf[128]

int i

int sock

struct sockaddr_in server = {0}

struct timeval timeo

timeo.tv_sec = 0

timeo.tv_usec = 1000 * 1000 //

socklen_t len = sizeof(timeo)

if( argc != 2)

{

printf("usage: ./client <ipaddress>\n")

return -1

}

sock = socket(AF_INET, SOCK_STREAM, 0)

if(sock <0)

{

perror("Create TCP Socket")

return -1

}

setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeo, len)

server.sin_family = AF_INET

server.sin_port = htons(30000)

inet_pton(AF_INET, argv[1], &(server.sin_addr))

int res = connect(sock, (struct sockaddr*)&server, sizeof(server))

if (res <0)

{

if(res == EINPROGRESS)

perror("connecting stream socket time out:")

else

perror("connecting stream socket error:")

close(sock)

return -1

}

else

{

printf("Connect Server@%s\n",argv[1])

for(i=0i<10i++)

{

int wsize = send(sock,wbuf,sizeof(wbuf),0)

if(wsize<=0)

{

perror("write error:")

close(sock)

return -1

}

printf("1111111i=%d\n",i)

while(1)

{

int rsize=recv(sock,rbuf,sizeof(rbuf),0)

if(rsize>0)

{

rbuf[rsize]='\0'

printf("recv msg from server: %s\n",rbuf)

break

}

if(rsize<0)

{

close(sock)

perror("read error:")

return -1

}

}

}

close(sock)

return 0

}

}

server.c:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

int main(int argc, char** argv)

{

intlistenfd, connfd

struct sockaddr_in servaddr = {0}

charrbuf[128]

charwbuf[] = "hello client"

int n

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

{

perror("Create TCP Socket")

return -1

}

servaddr.sin_family = AF_INET

servaddr.sin_addr.s_addr = htonl(INADDR_ANY)

servaddr.sin_port = htons(30000)

if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)

{

perror("bind socket error:")

return -1

}

if( listen(listenfd, 10) == -1)

{

perror("listen socket error:")

return -1

}

printf("======waiting for client's request======\n")

while(1)

{

if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)

{

perror("accept socket error:")

continue

}

while(1)

{

n = recv(connfd, rbuf, sizeof(rbuf), 0)

if(n>0)

{

rbuf[n] = '\0'

printf("recvmsg from client: %s\n", rbuf)

n = send(connfd, wbuf, sizeof(wbuf),0)

if(n<=0)

{

perror("sned error:")

close(connfd)

break

}

}

else if(n <0)

{

perror("recv error:")

close(connfd)

break

}

}

close(connfd)

}

close(listenfd)

return 0

}

运行的时候 client

./client 你的serverip

端口我用的30000 写死在程序里了


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

原文地址:https://54852.com/sjk/10019375.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存