在網絡傳輸中有兩種特別出名,一種是tcp,一種是udp。
他們都是基於套接字,tcp 屬於sock_stream 類型,udp 屬於sock_dgram。
sock_steam:服務器
sock_dgram網絡
具體能夠參考tcp和udp。dom
關於數據邊界:socket
https://blog.csdn.net/boiled_water123/article/details/81951373tcp
造成一個 socket 須要3個參數(int domain,int type,int protocal):
第一個參數是協議族,爲何有個協議族呢?協議族有ip4和ip6等。
就是一個分類,ip6是徹底不兼容ip4的,基於ip6的協議也沒法與ip4通信的。
type 表明性的爲:sock_steam,sock_dgram
而sock_steam默認的爲tcp,sock_dgram 默認的爲udp,因此第三位每每傳輸爲0。.net
服務器端:code
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") void ErrorHandling(char *message); int main(int argc, char * argv[]) { WSADATA wsaData; SOCKET hServerSock, hClientSock; SOCKADDR_IN serverAddr, clientAddr; int szclientAddr; char message[] = "Hello World"; if (argc != 2) { printf("Usage :%<port>\n",argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { ErrorHandling("WASAtartup() error!"); } hServerSock = socket(PF_INET,SOCK_STREAM,0); if (hServerSock==INVALID_SOCKET) { ErrorHandling("socket() error"); } memset(&serverAddr,0,sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(atoi(argv[1])); if (bind(hServerSock,(SOCKADDR *) &serverAddr,sizeof(serverAddr))==SOCKET_ERROR) { ErrorHandling("bind() error"); } if (listen(hServerSock,5)==SOCKET_ERROR) { ErrorHandling("listen() Error"); } szclientAddr = sizeof(clientAddr); hClientSock = accept(hServerSock,(SOCKADDR *) &serverAddr,&szclientAddr); if (hClientSock ==INVALID_SOCKET) { ErrorHandling("accept error"); } send(hClientSock,message,sizeof(message),0); closesocket(hClientSock); closesocket(hServerSock); WSACleanup(); return 0; } void ErrorHandling(char *message) { fputs(message,stderr); fputs('\n',stderr); exit(1); }
client 端:server
#include <stdio.h> #include <stdlib.h> #include <winsock2.h> void ErrorHandling(char* message); int main(int argc,char* argv[]) { WSADATA wsaData; SOCKET hSocket; SOCKADDR_IN servAddr; char message[30]; int strLen, read_len=0,index=0; if (argc!=3) { printf("Usage : %s <IP> <port>\n",argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { ErrorHandling("WSAStartup() error!"); } hSocket = socket(PF_INET,SOCK_STREAM,0); if (hSocket==INVALID_SOCKET) { ErrorHandling("socket() error"); } memset(&servAddr,0,sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = inet_addr(argv[1]); servAddr.sin_port = htons(atoi(argv[2])); if (connect(hSocket,(SOCKADDR*) &servAddr,sizeof(servAddr))==SOCKET_ERROR) { ErrorHandling("connect() error!"); } while (read_len=read(hSocket, &message[index++],1)) { if (read_len==-1) { break; } strLen += read_len; } printf("Message from server:%s \n",message); closesocket(hSocket); WSACleanup(); return 0; } void ErrorHandling(char* message) { fputs(message,stderr); fputc('\n',stderr); exit(1); }