您的位置:首页 > 理论基础 > 计算机网络

网络通信编程初步:windows socket 程序示例

2009-05-23 14:32 399 查看
/***********************************************************************
**程序功能:演示使用windows socket进行网络通信
**程序包括:一个服务端线程、三个客户端线程,分别接收、发送数据
**完成日期:2009-5-23
**作者 :lauo
*************************************************************************/
#include<iostream>
//#include"sock.h"
#include<winsock2.h>
#include<windows.h>
using namespace std;
#pragma comment( lib, "ws2_32.lib" ) //使用了静态连接库
DWORD WINAPI Servicer(LPVOID param)
{
WSADATA wsaData;
int err;
err=WSAStartup(MAKEWORD(1,1),&wsaData);
if(err!=0)
cout<<int(LOBYTE(wsaData.wVersion))<<"."<<int(HIBYTE(wsaData.wVersion))<<endl;
//创建用于监听的套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//本机地址
//cout<<htonl(INADDR_ANY)<<endl;
addrSrv.sin_family=AF_INET;//协议家族
addrSrv.sin_port=htons(6000);//端口号

//绑定套接字
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//第二个参数为要绑定的本机端口号及其地址等 端口与SOCKET绑定
listen(sockSrv,50);//5---flags 将套接字置为监听模式(服务器端)
SOCKADDR_IN addrClient;//客户端地址
int len=sizeof(SOCKADDR);
while(1)//服务死循环
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//建立一个接收请求的套接字,用以与客户端打交道
char recvBuf[256];
//接收数据
recv(sockConn,recvBuf,256,0);//阻塞式等待客户端的请求的到来
//打印接收的数据
cout<<recvBuf<<" from:"<<inet_ntoa(addrClient.sin_addr)<<endl;//inet_ntoa(addrClient.sin_addr)显示了客户请示的地址
closesocket(sockConn);
//
}
return 0;
}
DWORD WINAPI Clienter(LPVOID param)
{
WSADATA wsaData;
int err;
err=WSAStartup(MAKEWORD(1,1),&wsaData);
if(err!=0)
return 0;
while(1)//线程死循环
{
//创建用于发送数据的套接字
SOCKET sockClt=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.1");
//目标主机地址正确的本机地址应该为.168.0.1 或者主机网络IP(使用命令行命令:ipconfig 可以查看之)
addrSrv.sin_family=AF_INET;//协议家族
addrSrv.sin_port=htons(6000);//端口号

err=connect(sockClt,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//建立一个网络链接,非阻塞方式,链接不上直接返回-1
if(err==-1)//拉链不上服务器端
continue;
char sendBuf[256];//发达的数据缓冲区
sprintf(sendBuf,"Welcome to socket programing world ! at:clienter %d",*(int*)param);
//发送数据
err=send(sockClt,sendBuf,strlen(sendBuf)+1,0);//,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) <<endl;;
//cout<<"send:"<<err<<endl;
closesocket(sockClt);//关闭此次链接
Sleep(300*(rand()%5));
}
return 0;
}
int main()
{
int p0=0,p1=1,p2=2;
CreateThread(0,0,Servicer,0,0,0);//建立一个服务端线程
CreateThread(0,0,Clienter,(void*)&p0,0,0) ;//建立了三个客户端线程,用以展示一个服务端对多个链接的服务
CreateThread(0,0,Clienter,(void*)&p1,0,0) ;
CreateThread(0,0,Clienter,(void*)&p2,0,0) ;
while(1);//主线程死循环
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: