socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程采用的都是流式套接字。
服务端socket编程步骤:
1、加载套接字库,创建套接字(WSAStartup()/socket());
2、绑定套接字到一个IP地址和一个端口上(bind());
3、将套接字设置为监听模式等待请求(listen());
4、请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept());
5、用返回的套接字和客户端通信(send()/recv());
6、返回,等待另一连接请求;
7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());
客户端socket编程步骤:
1、加载套接字库,创建套接字(WSAStartup()/socket());
2、向服务端发送连接请求(connect());
3、和服务端进行通信(send()/recv());
4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());
第一式: 加载/释放Winsock库:
1.加载方法:
WSADATA wsa;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
return; //代表失败
}
2.释放方法:
WSACleanup();
第二式: 构造SOCKET:
1.服务端:构造监听SOCKET,流式SOCKET.
SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)
2.客户端:构造通讯SOCKET,流式SOCKET.
SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)
第三式:配置监听地址和端口:
1.服务端: SOCKADDR_IN serverAddr
ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(1234); /*本地监听端口:1234*/
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/
第四式: 绑定SOCKET:
1.服务端:绑定监听SOCKET.
bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))
第五式: 服务端/客户端连接:
1.服务端:等待客户端接入.
SOCKET Command_Sock = accept(Listen_Sock, ...)
2.客户端:请求与服务端连接.
int ret = connect(Client_Sock, ...)
第六式: 收/发数据:
1.服务端:等待客户端接入.char buf[1024].
接收数据:recv(Command_Sock,buf, ...)
或
发送数据:send(Command_Sock,buf, ...)
2.客户端:请求与服务端连接.char buf[1024].
发送数据:send(Client_Sock,buf, ...)
或
接收数据:recv(Client_Sock,buf, ...)
第七式: 关闭SOCKET:
1.服务端:关闭SOCKET.
closesocket(Listen_Sock)
closesocket(Command_Sock)
2.客户端:关闭SOCKET.
closesocket(Client_Sock)
server端:
1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char* argv[]) 8 { 9 //初始化WSA(Windows Sockets API) 10 WORD sockVersion = MAKEWORD(2, 2); //高8位设置2,低8位设置2 11 WSADATA wsaData; 12 if (WSAStartup(sockVersion, &wsaData) != 0) //sockVersion是一个int型变量 13 { 14 return 0; 15 } 16 17 //创建套接字 18 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //socket(int family, int type, int protocol) 19 if (slisten == INVALID_SOCKET) 20 { 21 printf("socket error !"); 22 return 0; 23 } 24 25 //绑定IP和端口 26 sockaddr_in sin; 27 sin.sin_family = AF_INET; //协议域 28 sin.sin_port = htons(8888); //端口 29 sin.sin_addr.S_un.S_addr = INADDR_ANY; //协议地址 30 if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //bind(SOCKET sock, const struct sockaddr *addr) 31 { 32 printf("bind error !"); 33 } 34 35 //开始监听 36 if (listen(slisten, 5) == SOCKET_ERROR) 37 { 38 printf("listen error !"); 39 return 0; 40 } 41 42 //循环接收数据 43 SOCKET sClient; 44 sockaddr_in remoteAddr; 45 int nAddrlen = sizeof(remoteAddr); 46 char revData[255]; 47 while (true) 48 { 49 printf("等待连接... "); 50 sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); 51 if (sClient == INVALID_SOCKET) 52 { 53 printf("accept error !"); 54 continue; 55 } 56 printf("接受到一个连接:%s ", inet_ntoa(remoteAddr.sin_addr)); 57 58 //接收数据 59 int ret = recv(sClient, revData, 255, 0); 60 if (ret > 0) 61 { 62 revData[ret] = 0x00; 63 printf(revData); 64 } 65 66 //发送数据 67 char * sendData = "你好,TCP客户端! "; 68 send(sClient, sendData, strlen(sendData), 0); 69 closesocket(sClient); 70 } 71 72 closesocket(slisten); 73 WSACleanup(); 74 return 0; 75 }
client端:
1 #include "stdafx.h" 2 #include <WINSOCK2.H> 3 #include <STDIO.H> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 8 int main(int argc, char* argv[]) 9 { 10 WORD sockVersion = MAKEWORD(2,2); 11 WSADATA data; 12 if(WSAStartup(sockVersion, &data) != 0) 13 { 14 return 0; 15 } 16 17 SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 18 if(sclient == INVALID_SOCKET) 19 { 20 printf("invalid socket !"); 21 return 0; 22 } 23 24 sockaddr_in serAddr; 25 serAddr.sin_family = AF_INET; 26 serAddr.sin_port = htons(8888); 27 serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 28 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) 29 { 30 printf("connect error !"); 31 closesocket(sclient); 32 return 0; 33 } 34 char * sendData = "你好,TCP服务端,我是客户端! "; 35 send(sclient, sendData, strlen(sendData), 0); 36 37 char recData[255]; 38 int ret = recv(sclient, recData, 255, 0); 39 if(ret > 0) 40 { 41 recData[ret] = 0x00; 42 printf(recData); 43 } 44 closesocket(sclient); 45 WSACleanup(); 46 return 0; 47 }