tcp簡單實驗 server.c #include /* See NOTES */ #include #include #include #include #include #include #include #include /*socket * bind * listen * accept * ... ...
tcp簡單實驗
server.c
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <signal.h> /*socket * bind * listen * accept * send/recv */ #define SERVER_PORT 8888 #define BACKLOG 10 int main(int argc, char **argv) { int iSocketServer; int iSocketClient; struct sockaddr_in tSocketServerAddr; struct sockaddr_in tSocketClientAddr; int iRet; int iAddrLen; int iRecvLen; unsigned char ucRecvBuf[1000]; //接收緩衝區 int iClientNum = -1; signal(SIGCHLD,SIG_IGN); //等待為子進程收屍信號 /* AF_INET為ipv4類型,SOCK_STREAM為Tcp連接類型,*/ iSocketServer = socket(AF_INET, SOCK_STREAM, 0); if( -1 == iSocketServer) { printf("socket error!\n"); return -1; } tSocketServerAddr.sin_family = AF_INET; tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net ,short */ tSocketServerAddr.sin_addr.s_addr = INADDR_ANY; /* 本機上的所有IP */ memset(tSocketServerAddr.sin_zero, 0, 8); /* 設置無用的空間為0 */ //配置本地信息iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
if( -1 == iRet) { printf("bind error!\n"); return -1; } //最大監聽個數BACKLOG iRet = listen(iSocketServer, BACKLOG); if( -1 == iRet) { printf("listen error!\n"); return -1; } while(1) { iAddrLen = sizeof(struct sockaddr); iSocketClient = accept(iSocketServer, (struct sockaddr *)&tSocketClientAddr, &iAddrLen); if (-1 != iSocketClient) { iClientNum++; printf("Get connect from client %d : %s\n", iClientNum, inet_ntoa(tSocketClientAddr.sin_addr)); if(!fork()) { /* 子進程的源碼 */ while(1) { /* 接收客戶端信息並列印出來 */ iRecvLen = recv(iSocketClient, ucRecvBuf, 999, 0); if(iRecvLen <= 0) { close(iSocketClient); return -1; } else { ucRecvBuf[iRecvLen] = '\0'; printf("Get Msg From Client %d: %s\n", iClientNum, ucRecvBuf); } } } } } close(iSocketServer); return 0; }
client.c
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <signal.h> /*socket * connet * send/recv */ #define SERVER_PORT 8888 int main(int argc, char **argv) { int iSocketClient; struct sockaddr_in tSocketServerAddr; int iRet; unsigned char ucSendBuf[1000]; int iSendLen; if(argc != 2) { printf("Usage:\n"); printf("%s<server_ip>\n", argv[0]); return -1; } iSocketClient = socket(AF_INET, SOCK_STREAM, 0); tSocketServerAddr.sin_family = AF_INET; tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net ,short */ if(0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr)) /* 本機上的所有IP */ { printf("invalid server_ip\n"); return -1; } memset(tSocketServerAddr.sin_zero, 0, 8); /* 設置無用的空間為0 */ iRet = connect(iSocketClient, (struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr)); if(iRet == -1) { printf("connect error!\n"); return -1; } while(1) { if(fgets(ucSendBuf, 999, stdin)) { iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0); if(iSendLen <= 0) { close(iSocketClient); return -1; } } } return 0; }