【Socket】linux套接字技术之tcp
生活随笔
收集整理的這篇文章主要介紹了
【Socket】linux套接字技术之tcp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.mystery引入
?
? ?1)UDP也可以編寫出C/S程序 ,另外TCP也可以編寫點對點通信。? ?2)網絡的本質就是資源共享,當前流行的P2P應用正好暗合了這種精神。
? ?3)當前流行的Web服務,其標準協議是HTTP,很多從事Web應用程序開發的開發者,從事的就是這種應用的網絡編程,所采用的開 發模式是瀏覽器/服務器結構,也稱為B/S結構 。
? ?4)B/S結構是C/S結構的一個變種,是指開發者不需要開發獨立的客戶端軟件,瀏覽器就是此時的客戶端,開發者只需要在服務器端編寫并部署腳本,資源請求者就可以通過URL進行訪問了。
? ?5)Socket提供一種原始套接字機制,能夠讓開發者直接操縱IP層。
? ?6)利用Socket編程還可以編寫出廣播和組播應用程序。
? ?7)廣播是指向當前局域網所有的在線主機發送數據,ARP協議就是利用廣播機制。
? ?8)組播相對廣播,也可了理解為廣播的一個子集,類似于QQ中的群。
2.源碼
?
? ?服務端: //TCPServer.c #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #define SERVER_PORT 5555 main() {int serverSocket;struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[1024];int iDataNum ;if((serverSocket = socket(AF_INET,SOCK_STREAM,0)) < 0){perror("socket");exit(1);}bzero(&server_addr,sizeof(server_addr));server_addr.sin_family =AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0){perror("connect");exit(1);}if(listen(serverSocket,5)<0){perror("listen");exit(1);}while(1){client = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len);if(client < 0){perror("accept");continue;}iDataNum = recv(client,buffer,1024,0);if(iDataNum < 0){perror("Recv");continue;}printf("\nRecv client data.......\n");printf("IP is %s\n",inet_ntoa(clientAddr.sin_addr));printf("Port is %d\n",htons(clientAddr.sin_port));printf("Recv Data is %s\n",buffer);send(client,buffer,sizeof(buffer),0);} } View Code?
? ?客服端: //TCPClient.c #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> main() {struct sockaddr_in serverAddr;int clientSocket;char sendbuf[200];char recvbuf[200];if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0){perror( "socket error" );return -1;}serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(5555);serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0){perror("connect");exit(1);}printf("connect with destination host.....\n");while(1){printf("Input your World:>");scanf("%s",sendbuf);printf("\n");if(strcmp(sendbuf,"quit") == 0)break;send(clientSocket,sendbuf,sizeof(sendbuf),0);recv(clientSocket,recvbuf,200,0);printf("recv data of my world is: %s\n",recvbuf);}close(clientSocket);return 0; } View Code
?
3.mystery注解
?
? ?1) addr_in存儲主機IP地址? ?2)sockaddr_in用于表示Internet協議簇地址結構
? ?3)sockaddr存儲主機IP地址與接口信息
? ?4)addr_in是一個結構體,其中包含一個聯合體,其中結構體s_un_b中的4個字段s_b1/s_b2/s_b3/s_b4分別對應IP地址點分法下的4個 值
? ?5)inet_addr()函數的作用是將字符形式的IP地址轉換成整數值
? ?6)htons()和htonl()函數用于字節序的轉換,表示將數值從主機字節序轉換成網絡字節序
? ?7)htons()函數是16字節序轉換
? ?8)htonl()函數是32字節序轉換
?
總結
以上是生活随笔為你收集整理的【Socket】linux套接字技术之tcp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware ESXi导出OVF模板
- 下一篇: 数学笔记--线性代数