【Socket】linux套接字技术之tcp
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                【Socket】linux套接字技术之tcp
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                1.mystery引入
?
? ?1)UDP也可以編寫出C/S程序 ,另外TCP也可以編寫點(diǎn)對點(diǎn)通信。? ?2)網(wǎng)絡(luò)的本質(zhì)就是資源共享,當(dāng)前流行的P2P應(yīng)用正好暗合了這種精神。
? ?3)當(dāng)前流行的Web服務(wù),其標(biāo)準(zhǔn)協(xié)議是HTTP,很多從事Web應(yīng)用程序開發(fā)的開發(fā)者,從事的就是這種應(yīng)用的網(wǎng)絡(luò)編程,所采用的開 發(fā)模式是瀏覽器/服務(wù)器結(jié)構(gòu),也稱為B/S結(jié)構(gòu) 。
? ?4)B/S結(jié)構(gòu)是C/S結(jié)構(gòu)的一個變種,是指開發(fā)者不需要開發(fā)獨(dú)立的客戶端軟件,瀏覽器就是此時的客戶端,開發(fā)者只需要在服務(wù)器端編寫并部署腳本,資源請求者就可以通過URL進(jìn)行訪問了。
? ?5)Socket提供一種原始套接字機(jī)制,能夠讓開發(fā)者直接操縱IP層。
? ?6)利用Socket編程還可以編寫出廣播和組播應(yīng)用程序。
? ?7)廣播是指向當(dāng)前局域網(wǎng)所有的在線主機(jī)發(fā)送數(shù)據(jù),ARP協(xié)議就是利用廣播機(jī)制。
? ?8)組播相對廣播,也可了理解為廣播的一個子集,類似于QQ中的群。
2.源碼
?
? ?服務(wù)端: //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存儲主機(jī)IP地址? ?2)sockaddr_in用于表示Internet協(xié)議簇地址結(jié)構(gòu)
? ?3)sockaddr存儲主機(jī)IP地址與接口信息
? ?4)addr_in是一個結(jié)構(gòu)體,其中包含一個聯(lián)合體,其中結(jié)構(gòu)體s_un_b中的4個字段s_b1/s_b2/s_b3/s_b4分別對應(yīng)IP地址點(diǎn)分法下的4個 值
? ?5)inet_addr()函數(shù)的作用是將字符形式的IP地址轉(zhuǎn)換成整數(shù)值
? ?6)htons()和htonl()函數(shù)用于字節(jié)序的轉(zhuǎn)換,表示將數(shù)值從主機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序
? ?7)htons()函數(shù)是16字節(jié)序轉(zhuǎn)換
? ?8)htonl()函數(shù)是32字節(jié)序轉(zhuǎn)換
?
總結(jié)
以上是生活随笔為你收集整理的【Socket】linux套接字技术之tcp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: VMware ESXi导出OVF模板
- 下一篇: 数学笔记--线性代数
