標籤:
1 //伺服器端 server.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<errno.h> 6 #include<sys/types.h> 7 #include<sys/socket.h> 8 #include<netinet/in.h> 9 #define MAXLINE 409610 11 //socket(int domain, int type, int protocol)12 // 協議域 socket類型 指定協議13 int main(int argc, char **argv)14 {15 int n, listenfd, connfd;16 struct sockaddr_in servaddr;17 char buff[MAXLINE];18 if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )19 {20 printf("create socket error:%s(error:%d)\n",strerror(errno),errno);21 exit(0);22 }23 memset(&servaddr, 0, sizeof(servaddr));24 servaddr.sin_family = AF_INET;25 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //系統綁定預設的網卡即IP地址26 servaddr.sin_port = htons(6666); //監聽原生6666號連接埠27 28 if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)29 { //把一個地址族中的特定地址賦給socket30 printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);31 exit(0);32 }33 if( listen(listenfd, 10) == -1)34 { //調用listen()監聽socket35 printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);36 exit(0);37 }38 printf("waiting for client‘s request...\n");39 while(1)40 {41 if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)42 { //調用accept()函數取接收請求,串連建立好43 printf("accept socket error: %s(errno: %d)",strerror(errno),errno);44 continue;45 }46 n = recv(connfd, buff, MAXLINE, 0); //recv函數返回其實際copy的位元組數47 buff[n] = ‘\0‘;48 printf("recv msg from client: %s\n", buff);49 close(connfd);50 }51 close(listenfd);52 }
1 //用戶端 client.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<errno.h> 6 #include<sys/types.h> 7 #include<sys/socket.h> 8 #include<netinet/in.h> 9 #define MAXLINE 409610 11 int main(int argc, char** argv)12 {13 int n, sockfd;14 char recvline[MAXLINE], sendline[MAXLINE];15 struct sockaddr_in servaddr;16 if( argc != 2)17 {18 printf("usage: ./client <ipaddress>\n");19 exit(0);20 }21 if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)22 {23 printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);24 exit(0);25 }26 memset(&servaddr, 0, sizeof(servaddr));27 servaddr.sin_family = AF_INET;28 servaddr.sin_port = htons(6666);29 30 if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)31 { //IP地址轉換函式32 printf("inet_pton error for %s\n",argv[1]);33 exit(0);34 }35 if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)36 { //調用connect()發出串連請求37 printf("connect error: %s(errno: %d)\n",strerror(errno),errno);38 exit(0);39 }40 printf("send msg to server: \n");41 fgets(sendline, 4096, stdin);42 if( send(sockfd, sendline, strlen(sendline), 0) < 0)43 {44 printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);45 exit(0);46 }47 close(sockfd);48 exit(0);49 }
分別用gcc編譯好後執行,開2個終端:
Linux socket學習