网络程序设计开课了,写了个socket,目前还不完善,先贴出来,改进后再改
服务器端代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<netinet/in.h> #include<time.h> #define SERVER_PORT 8080 #define BUFFER_SIZE 255 /* 1.socket 2.connect 3.send 4.recv 5.close */ int getPort(); int getConnection(char *ip); void communication(char *ip); int main(int argc, char *argv[]) { communication(argv[1]); return 0; } /*获得端口号,由随机数生成*/ int getPort() { int port = 0; srand(time(NULL)); port = (8080+rand()%65335); return port; } /*获得连接,返回套接字句柄clientfd*/ int getConnection(char *ip) { int clientfd; int connectionfd; int length = 0; struct sockaddr_in serveraddr; struct sockaddr_in clientaddr; if( (clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error!\n"); exit(1); } int clientport = getPort(); bzero((char *)&clientaddr, sizeof(clientaddr)); clientaddr.sin_family = AF_INET; clientaddr.sin_port = htons(clientport); clientaddr.sin_addr.s_addr = htons(INADDR_ANY); /*初始化服务器套接字地址结构,以用于连接*/ bzero((char *)&serveraddr, sizeof (serveraddr)); serveraddr.sin_family = AF_INET; inet_aton(ip, &serveraddr.sin_addr); serveraddr.sin_port = htons(SERVER_PORT);//将一个点分十进制串转换为一个网络字节序的ip地址 // serveraddr.sin_addr.s_addr = htons(INADDR_ANY); if( (connectionfd = connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0 ) { printf("can't connect to %s!\n", ip); exit(0); } return clientfd; } /*申请服务,并接收服务器响应*/ void communication(char *ip) { char buf[BUFFER_SIZE]; char recvmsg[BUFFER_SIZE]; int clientfd = getConnection(ip); while(1) { printf("enter a string:"); scanf("%s", buf); if( strcmp(buf, "q") == 0 ) break; send(clientfd, buf, BUFFER_SIZE, 0); recv(clientfd, recvmsg, strlen(recvmsg), 0); printf("%s\n", recvmsg); //fflush(stdin); select() } close(clientfd); }
客户端代码:#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<netinet/in.h> #include<time.h> #define SERVER_PORT 8080 #define BUFFER_SIZE 255 /* 1.socket 2.connect 3.send 4.recv 5.close */ int getPort(); int getConnection(char *ip); void communication(char *ip); int main(int argc, char *argv[]) { communication(argv[1]); return 0; } /*获得端口号,由随机数生成*/ int getPort() { int port = 0; srand(time(NULL)); port = (8080+rand()%65335); return port; } /*获得连接,返回套接字句柄clientfd*/ int getConnection(char *ip) { int clientfd; int connectionfd; int length = 0; struct sockaddr_in serveraddr; struct sockaddr_in clientaddr; if( (clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error!\n"); exit(1); } int clientport = getPort(); bzero((char *)&clientaddr, sizeof(clientaddr)); clientaddr.sin_family = AF_INET; clientaddr.sin_port = htons(clientport); clientaddr.sin_addr.s_addr = htons(INADDR_ANY); /*初始化服务器套接字地址结构,以用于连接*/ bzero((char *)&serveraddr, sizeof (serveraddr)); serveraddr.sin_family = AF_INET; inet_aton(ip, &serveraddr.sin_addr); serveraddr.sin_port = htons(SERVER_PORT);//将一个点分十进制串转换为一个网络字节序的ip地址 // serveraddr.sin_addr.s_addr = htons(INADDR_ANY); if( (connectionfd = connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0 ) { printf("can't connect to %s!\n", ip); exit(0); } return clientfd; } /*申请服务,并接收服务器响应*/ void communication(char *ip) { char buf[BUFFER_SIZE]; char recvmsg[BUFFER_SIZE]; int clientfd = getConnection(ip); while(1) { printf("enter a string:"); scanf("%s", buf); if( strcmp(buf, "q") == 0 ) break; send(clientfd, buf, BUFFER_SIZE, 0); recv(clientfd, recvmsg, strlen(recvmsg), 0); printf("%s\n", recvmsg); //fflush(stdin); select() } close(clientfd); }