在网络传输中有两种特别出名,一种是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); }