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)

}

}

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

1、组成:应用层、传输层、网络层、链路层

2、各层主要功能:

应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。

传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。

网络层:负责路由以及把分组报文发送给目标网络或主机。

链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。

扩展资料

OSI是开放系统互连参考模型 (Open System Interconnect 简称OSI),是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。

它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

而TCP/IP简单来说就是OSI的简化版,把OSI的七层简化为了四层。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

参考资料:百度百科 - TCP/IP协议


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

原文地址:https://54852.com/yw/8440121.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存