Windows Socket API 编程(上):TCP篇

需要链接Ws2_32.lib;

服务器端:

  

1. 加载套接字库WSAStartup()

2. 创建Socket,使用函数Socket();

3. 绑定到端口 bind() 将一个本地地址和一个套接字关联起来这里需要一个地址结构体 

   Sockaddr TCP/IP协议中用 sockaddr_in来代替sockaddr

4. 将创建的socket设置为监听状态 使用listen()

5. 等待客户的连接请求,并接受客户的请求 

   accpt(), 该函数需要一个sockaddr结构体用来保存请求端的IP和端口信息,同时返回一个新的socket,用于和请求端进行通信 

6. 发送,send()

7. 当通信的另一段发送信息过来时,可以通过recv()来接收该信息;

8. 当通信结束时,需要关闭用于通信的socketclosesocket释放该资源

9. 当所有请求处理完后,需要关闭用于监听的socket,并调用WSACleanup()

客户端:

1. 加载套接字库WSAStartup()

2. 创建Socket,使用函数Socket();

3. 对于客户端来说,不需要bind,可以直接去连接服务器端,即使用connect(),想服务器端发出请求

4. 调用recv()接收来自服务器端的响应;

5. 当然,也可以给服务器发送信息, 同样的send();

6. 当通信结束时,需要关闭用于通信的socketclosesocket释放该资源

下面是实例代码:

 

服务器端;

#include <winsock2.h>

#include <stdio.h>

int main(void)

{

//加载套接字库,可以直接从MSDN或其他文献粘贴即可

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );   //套接字版本号

err = WSAStartup( wVersionRequested, &wsaData ); // 成功返回0

if ( err != 0 ) {

return -1;

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1) {

WSACleanup( );

return -1; 

}

SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); //创建socket,用于监听

       // 套接字结构体,用于保存与监听套接字关联的IP和端口号

SOCKADDR_IN  addrSrv;                        

addrSrv.sin_family = AF_INET; //地址族

addrSrv.sin_addr.S_un.S_addr  = htonl(INADDR_ANY);//转化为网络地址

addrSrv.sin_port = htons(6000); // 绑定端口6000,端口号不能小于1024

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  //将填充好的sockaddr             /socket关联,即绑定

     listen(sockSrv,5);  //设置为监听状态,最大连接数为5

while(1)

{

SOCKET sockConn = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrConn;

//converts a u_long from host to TCP/IP network byte order 

addrConn.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  

addrConn.sin_family = AF_INET;

addrConn.sin_port  =  htons(6000);

int len = sizeof(SOCKADDR);

//accept函数,在监听端口上接受来自于客户端的请求,并将客户端的信息保存在 //addrConn

sockConn = accept(sockSrv,(SOCKADDR*)&addrConn,&len);

         char sendBuf[50];

char recvBuf[50];

sprintf(sendBuf,"welcome to world !\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送

recv(sockConn,recvBuf,strlen(recvBuf)+1,0);  //接收

printf("%s",recvBuf);

closesocket(sockConn);                   //关闭通信socket

}

return 0;

}

客户端:

#include <winsock2.h>

#include <stdio.h>

int main(void)

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) 

{

return -1;

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1) 

{

WSACleanup( );

return -1; 

}

SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

     SOCKADDR_IN  addrSrv;

    

//The Windows Sockets inet_addr function converts a string containing an (Ipv4) Internet Protocol  //dotted address into a proper address for the IN_ADDR structure

addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

addrSrv.sin_family = AF_INET;

addrSrv.sin_port = htons(6000);

     connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //向服务器端发送请求, //建立连接

char recvBuf[50] ;

recv(sockClient,recvBuf,sizeof(recvBuf)+1,0);

printf("%s\n",recvBuf);

send(sockClient,"zhai is zhai xiaoyan\n",strlen("zhai is zhai xiaoyan\n")+1,0);

closesocket(sockClient);

WSACleanup();  //关闭套接字库

return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值