使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。
--摘自某博主的总结
WindowsSockets编程
加载套接字库
创建套接字
绑定地址信息
服务器端与客户端互相通信
服务器端代码:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{return;}
if(LOBYTE(wsaData.wVersion)!=0 || HIBYTE(wsaData.wVersion)!=0)
{
WSACleanup();
return;
}
//创建用于监听的套接字
SOCKET sockSrc=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrc;
addrSrc.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrc.sin_family=AF_INET;
addrSrc.sin_port=htons(3000);
//绑定套接字
bind(sockSrc,(SOCKADDR*)&addrSrc,sizeof(SOCKADDR));
//将套接字设为监听模式,准备接收客户请求
listen(sockSrc,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
//等待客户请求到来
SOCKET sockConn=accept(sockSrc,(SOCKADDR *)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to C++ world",inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
客户端代码:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{return;}
if(LOBYTE(wsaData.wVersion)!=0 || HIBYTE(wsaData.wVersion)!=0)
{
WSACleanup();
return;
}
//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(3000);
//向服务器发送请求
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//接收数据
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
//发送数据
send(sockClient,"This is my world",strlen("This is my world")+1,0);
//关闭套接字
closesocket(sockClient);
WSACleanup();
}
Unix/Linux socket编程
http://www.cnblogs.com/MyLove-Summer/p/5215287.html