diff --git a/cli.py b/cli.py new file mode 100644 index 0000000..e48c767 --- /dev/null +++ b/cli.py @@ -0,0 +1,24 @@ +# 导入 socket、sys 模块 +import socket +import sys + +# 创建 socket 对象 +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +# 获取本地主机名 +host = socket.gethostname() + +# 设置端口号 +port = 9999 + +# 连接服务,指定主机和端口 +s.connect((host, port)) + +# 接收小于 1024 字节的数据 + +tex = "this is test" +s.send(tex.encode('utf-8')) +msg = s.recv(1024) +s.close() + +print (msg.decode('utf-8')) diff --git a/client.c b/client.c index e123251..3ef62cd 100644 --- a/client.c +++ b/client.c @@ -1,47 +1,86 @@ -#include "stdafx.h" -#include -#include +#include "inclu.h" -#pragma comment(lib,"ws2_32.lib") - - -int main(int argc, char* argv[]) + +/*readline函数实现*/ +ssize_t readline(int fd, char *vptr, size_t maxlen) { - WORD sockVersion = MAKEWORD(2,2); - WSADATA data; - if(WSAStartup(sockVersion, &data) != 0) - { - return 0; - } - - SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if(sclient == INVALID_SOCKET) - { - printf("invalid socket !"); - return 0; - } - - sockaddr_in serAddr; - serAddr.sin_family = AF_INET; - serAddr.sin_port = htons(8888); - serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); - if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) - { - printf("connect error !"); - closesocket(sclient); - return 0; - } - char * sendData = "你好,TCP服务端,我是客户端!\n"; - send(sclient, sendData, strlen(sendData), 0); - - char recData[255]; - int ret = recv(sclient, recData, 255, 0); - if(ret > 0) - { - recData[ret] = 0x00; - printf(recData); - } - closesocket(sclient); - WSACleanup(); - return 0; + ssize_t n, rc; + char c, *ptr; + + ptr = vptr; + for (n = 1; n < maxlen; n++) { + if ( (rc = read(fd, &c,1)) == 1) { + *ptr++ = c; + if (c == '\n') + break; /* newline is stored, like fgets() */ + } else if (rc == 0) { + *ptr = 0; + return(n - 1); /* EOF, n - 1 bytes were read */ + } else + return(-1); /* error, errno set by read() */ + } + + *ptr = 0; /* null terminate like fgets() */ + return(n); +} + + +int main(int argc , char ** argv) +{ + /*声明套接字和链接服务器地址*/ + int sockfd; + struct sockaddr_in servaddr; + + /*判断是否为合法输入*/ + if(argc != 2) + { + perror("usage:tcpcli "); + exit(1); + }//if + + /*(1) 创建套接字*/ + if((sockfd = socket(AF_INET , SOCK_STREAM , 0)) == -1) + { + perror("socket error"); + exit(1); + }//if + + /*(2) 设置链接服务器地址结构*/ + bzero(&servaddr , sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(PORT); + if(inet_pton(AF_INET , argv[1] , &servaddr.sin_addr) < 0) + { + printf("inet_pton error for %s\n",argv[1]); + exit(1); + }//if + + /*(3) 发送链接服务器请求*/ + if( connect(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr)) < 0) + { + perror("connect error"); + exit(1); + }//if + + /*(4) 消息处理*/ + char sendline[MAX_LINE] , recvline[MAX_LINE]; + while(fgets(sendline , MAX_LINE , stdin) != NULL) + { + write(sockfd , sendline , strlen(sendline)); + + if(readline(sockfd , recvline , MAX_LINE) == 0) + { + perror("server terminated prematurely"); + exit(1); + }//if + + if(fputs(recvline , stdout) == EOF) + { + perror("fputs error"); + exit(1); + }//if + }//while + + /*(5) 关闭套接字*/ + close(sockfd); } diff --git a/inclu.h b/inclu.h new file mode 100644 index 0000000..d4fb070 --- /dev/null +++ b/inclu.h @@ -0,0 +1,16 @@ +#include +//#include +//#include +#include +//#include +//#include +//#include +//#include +//#include +//#include +// +//const int MAX_LINE = 2048; +const int PORT = 6000; +const int BACKLOG = 10; +const int LISTENQ = 6666; +const int MAX_CONNECT = 20; diff --git a/ser.py b/ser.py new file mode 100644 index 0000000..92cc8d8 --- /dev/null +++ b/ser.py @@ -0,0 +1,25 @@ +# 导入 socket、sys 模块 +import socket +import sys + +# 创建 socket 对象 +serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +# 获取本地主机名 +host = socket.gethostname() + +port = 9999 + +# 绑定端口号 +serversocket.bind((host, port)) + +# 设置最大连接数,超过后排队 +serversocket.listen(5) + +while True: + clientsocket,addr = serversocket.accept() + print("连接地址: %s" % str(addr)) + masg='欢迎访问菜鸟教程!'+ "\r\n" + msg = clientsocket.recv(1024) + clientsocket.send(msg) + clientsocket.close() diff --git a/server.c b/server.c index 9ead5f5..a4465f0 100644 --- a/server.c +++ b/server.c @@ -1,75 +1,73 @@ -#include "stdafx.h" -#include -#include - -#pragma comment(lib,"ws2_32.lib") - -int main(int argc, char* argv[]) +#include "inclu.h" + +int main(int argc , char **argv) { - //初始化WSA - WORD sockVersion = MAKEWORD(2,2); - WSADATA wsaData; - if(WSAStartup(sockVersion, &wsaData)!=0) - { - return 0; - } - - //创建套接字 - SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if(slisten == INVALID_SOCKET) - { - printf("socket error !"); - return 0; - } - - //绑定IP和端口 - sockaddr_in sin; - sin.sin_family = AF_INET; - sin.sin_port = htons(8888); - sin.sin_addr.S_un.S_addr = INADDR_ANY; - if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) - { - printf("bind error !"); - } - - //开始监听 - if(listen(slisten, 5) == SOCKET_ERROR) - { - printf("listen error !"); - return 0; - } - - //循环接收数据 - SOCKET sClient; - sockaddr_in remoteAddr; - int nAddrlen = sizeof(remoteAddr); - char revData[255]; - while (true) - { - printf("等待连接...\n"); - sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); - if(sClient == INVALID_SOCKET) - { - printf("accept error !"); - continue; - } - printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); - - //接收数据 - int ret = recv(sClient, revData, 255, 0); - if(ret > 0) - { - revData[ret] = 0x00; - printf(revData); - } - - //发送数据 - char * sendData = "你好,TCP客户端\n"; - send(sClient, sendData, strlen(sendData), 0); - closesocket(sClient); - } - - closesocket(slisten); - WSACleanup(); - return 0; + /*声明服务器地址和客户链接地址*/ + struct sockaddr_in servaddr , cliaddr; + + /*声明服务器监听套接字和客户端链接套接字*/ + int listenfd , connfd; + pid_t childpid; + + /*声明缓冲区*/ + char buf[MAX_LINE]; + + socklen_t clilen; + + /*(1) 初始化监听套接字listenfd*/ + if((listenfd = socket(AF_INET , SOCK_STREAM , 0)) < 0) + { + perror("socket error"); + exit(1); + }//if + + /*(2) 设置服务器sockaddr_in结构*/ + bzero(&servaddr , sizeof(servaddr)); + + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //表明可接受任意IP地址 + servaddr.sin_port = htons(PORT); + + /*(3) 绑定套接字和端口*/ + if(bind(listenfd , (struct sockaddr*)&servaddr , sizeof(servaddr)) < 0) + { + perror("bind error"); + exit(1); + }//if + + /*(4) 监听客户请求*/ + if(listen(listenfd , LISTENQ) < 0) + { + perror("listen error"); + exit(1); + }//if + + /*(5) 接受客户请求*/ + for( ; ; ) + { + clilen = sizeof(cliaddr); + if((connfd = accept(listenfd , (struct sockaddr *)&cliaddr , &clilen)) < 0 ) + { + perror("accept error"); + exit(1); + }//if + + //新建子进程单独处理链接 + if((childpid = fork()) == 0) + { + close(listenfd); + //str_echo + ssize_t n; + char buff[MAX_LINE]; + while((n = read(connfd , buff , MAX_LINE)) > 0) + { + write(connfd , buff , n); + } + exit(0); + }//if + close(connfd); + }//for + + /*(6) 关闭监听套接字*/ + close(listenfd); } diff --git a/test1.c b/test1.c deleted file mode 100644 index 41450d5..0000000 --- a/test1.c +++ /dev/null @@ -1 +0,0 @@ -#include <>