Linux 网络编程详解二(socket创建流程、多进程版)
生活随笔
收集整理的這篇文章主要介紹了
Linux 网络编程详解二(socket创建流程、多进程版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
netstat -na | grep "8080" --查看TCP/IP協議連接狀態 //socket編程提高版--服務器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>int main(int arg, char *args[])
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1){perror("socket() err");return -1;}//地址復用int on = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1){perror("setsockopt() err");return -1;}//
struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = inet_addr("127.0.0.1");/** INADDR_ANY表示的是IP地址(0,0,0,0)這樣的主機字節序變量* 本來主機字節序變量轉化成網絡字節序變量,需要使用htonl()函數,* 但是INADDR_ANY比較特殊,它的所有位都是0,不存在大端字節序或者小端字節序的情況* 所以不需要使用htonl()函數* *///表示綁定任意一個地址(但是不推薦,最好使用本機ip地址)//addr.sin_addr.s_addr=INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1){perror("bind() err");return -1;}/** 一旦調用listen函數,這個套接字sockfd將變成被動套接字,只能接受連接,不能主動發送連接* */if (listen(sockfd, SOMAXCONN) == -1){perror("bind() err");return -1;}struct sockaddr_in peeraddr;socklen_t peerlen = sizeof(peeraddr);int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);if (conn == -1){perror("accept() err");return -1;}printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));char recvbuf[1024] = { 0 };while (1){int rc = read(conn, recvbuf, sizeof(recvbuf));if (rc == 0){printf("client is closed !\n");break;} else if (rc < 0){printf("read() failed ! error message:%s\n", strerror(errno));break;}printf("recv message:%s\n", recvbuf);write(conn, recvbuf, rc);memset(recvbuf, 0, sizeof(recvbuf));}close(conn);close(sockfd);return 0;
} //socket編程提高版--客戶端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>int main(int arg, char *args[])
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1){perror("socket() err");return -1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = inet_addr("127.0.0.1");if (connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1){perror("socket() err");return -1;}char sendbuf[1024]={0};char recvbuf[1024]={0};while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){//sendwrite(sockfd,sendbuf,sizeof(sendbuf));//recvint rc=read(sockfd,recvbuf,sizeof(recvbuf));if(rc<0){perror("read() error");break;}else if(rc==0){printf("connect is cloesd !\n");break;}printf("recv message:%s\n",recvbuf);memset(sendbuf,0,sizeof(sendbuf));memset(recvbuf,0,sizeof(recvbuf));}return 0;
}
?
//socket編程提高版--多進程版服務器 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>int main(int arg, char *args[]) {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1){perror("socket() err");return -1;}//地址復用int on = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1){perror("setsockopt() err");return -1;}// struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = inet_addr("127.0.0.1");/** INADDR_ANY表示的是IP地址(0,0,0,0)這樣的主機字節序變量* 本來主機字節序變量轉化成網絡字節序變量,需要使用htonl()函數,* 但是INADDR_ANY比較特殊,它的所有位都是0,不存在大端字節序或者小端字節序的情況* 所以不需要使用htonl()函數* *///表示綁定任意一個地址(但是不推薦,最好使用本機ip地址)//addr.sin_addr.s_addr=INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1){perror("bind() err");return -1;}/** 一旦調用listen函數,這個套接字sockfd將變成被動套接字,只能接受連接,不能主動發送連接* */if (listen(sockfd, SOMAXCONN) == -1){perror("bind() err");return -1;}//int conn = 0;while (1){struct sockaddr_in peeraddr;socklen_t peerlen = sizeof(peeraddr);int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);if (conn == -1){perror("accept() err");return -1;}printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));int pid = fork();if (pid == -1){perror("fork() err");break;}if (pid == 0){char recvbuf[1024] = { 0 };while (1){int rc = read(conn, recvbuf, sizeof(recvbuf));if (rc == 0){printf("client is closed !\n");break;} else if (rc < 0){printf("read() failed ! error message:%s\n",strerror(errno));break;}printf("recv message:%s\n", recvbuf);write(conn, recvbuf, rc);memset(recvbuf, 0, sizeof(recvbuf));}close(conn);close(sockfd);exit(0);} else{close(conn);}}close(sockfd);return 0; }?
總結
以上是生活随笔為你收集整理的Linux 网络编程详解二(socket创建流程、多进程版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】编程思想之消息机制
- 下一篇: wireshark从入门到精通(协议排错