win32下C++ Socket编程

     这个例子是从网上转抄过来的,经过本人测试,没有任何问题,想学Socket编程的人可以看一下,非常不错的入门程序。

服务器端:

#include <iostream>
#include <WinSock2.h>


using namespace std;


const unsigned short LISTEN_PORT = 7788; 


#pragma comment(lib,"ws2_32.lib") //ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程


int main(int argc, char* argv[])
{
WORD wVersionRequested = MAKEWORD(1, 1);  
WSADATA wsaData;  


int err = WSAStartup(wVersionRequested, &wsaData);  
if ( 0 != err )  
{  
cout<<"WSAStartup failed. return: "<<err<<endl;  
return -1;  
}  


if ( wsaData.wVersion != wVersionRequested )  
{  
cout<<"wsaData.wVersion: "<<wsaData.wVersion<<" is not equal to wVersionRequested: "<<wVersionRequested<<endl;  
WSACleanup();  
return -2;  
}  


SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);  
if ( INVALID_SOCKET == sock )  
{  
cout<<"socket error: "<<WSAGetLastError()<<endl;  
return -3;  
}  


SOCKADDR_IN addr_server;  
addr_server.sin_family  = AF_INET;  
addr_server.sin_port    = htons(LISTEN_PORT);  
addr_server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  


err = bind(sock, (SOCKADDR*)&addr_server, sizeof(addr_server));  
if ( SOCKET_ERROR == err )
{  
cout<<"bind error: "<<WSAGetLastError()<<endl;  
return -4;  
}  


err = listen(sock, SOMAXCONN);  
if ( SOCKET_ERROR == err )  
{  
cout<<"listen error: "<<WSAGetLastError()<<endl;  
return -5;  
}  


cout<<"Start listening on port "<<LISTEN_PORT<<endl;  


SOCKADDR_IN addr_client;  
int addrlen = sizeof(addr_client);  


while (true)  
{  
SOCKET sock_con = accept(sock, (SOCKADDR*)&addr_client, &addrlen);  
if ( INVALID_SOCKET != sock_con )  
{  
cout<<inet_ntoa(addr_client.sin_addr)<<":"<<ntohs(addr_client.sin_port)<<" connected!"<<endl;  


char recv_buf[256];  
char send_buf[512];  


while (true)  
{  
err = recv(sock_con, recv_buf, sizeof(recv_buf), 0);  
if ( err <= 0 )  
{  
cout<<"recv error: "<<WSAGetLastError()<<endl;  
break;  
}  


sprintf(send_buf, "%s:%d said: %s", inet_ntoa(addr_client.sin_addr), ntohs(addr_client.sin_port), recv_buf);  


cout<<send_buf<<endl;  


sprintf(send_buf, "200.1.1.8:5000 said : %s", recv_buf);  


err = send(sock_con, send_buf, strlen(send_buf) + 1, 0);  
if ( SOCKET_ERROR == err )  
{  
cout<<"send error: "<<WSAGetLastError()<<endl;
break;  
}  
}  


cout<<inet_ntoa(addr_client.sin_addr)<<":"<<ntohs(addr_client.sin_port)<<" leave!"<<endl;  


err = closesocket(sock_con);  
if ( SOCKET_ERROR == err )  
{  
cout<<"closesocket error: "<<WSAGetLastError()<<endl;  
}  
}  
else  
{  
cout<<"accept error: "<<WSAGetLastError()<<endl;  
}  
}  


return 0;
}


客户端:

#include <iostream>  
#include <WinSock2.h>  
  
using namespace std; 


const char* SERVER_IP = "200.1.1.8";  
const unsigned short SERVER_PORT = 7788;  
  
#pragma comment(lib,"ws2_32.lib") //ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程


int main(int argc, char* argv[])  
{  
WORD wVersionRequested = MAKEWORD(1, 1);  
WSADATA wsaData;  


int err = WSAStartup(wVersionRequested, &wsaData);  
if ( 0 != err )  
{  
cout<<"WSAStartup failed. return: "<<err<<endl;  
return -1;  
}  


if ( wsaData.wVersion != wVersionRequested )  
{  
cout<<"wsaData.wVersion: "<<wsaData.wVersion<<" is not equal to wVersionRequested: "<<wVersionRequested<<endl;  
WSACleanup();  
return -2;  
}  


SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);  
if ( INVALID_SOCKET == sock )  
{  
cout<<"socket error: "<<WSAGetLastError()<<endl;  
return -3;  
}  


SOCKADDR_IN addr_server;  
addr_server.sin_family  = AF_INET;  
addr_server.sin_port    = htons(SERVER_PORT);  
addr_server.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);  


err = connect(sock, (SOCKADDR*)&addr_server, sizeof(addr_server));  
if ( SOCKET_ERROR == err )  
{  
cout<<"connect error: "<<WSAGetLastError()<<endl;  
return -4;  
}  


cout<<"Connection established,input 'quit' or 'exit' to exit."<<endl;


char send_buf[256];  
char recv_buf[512];  


while (true)  
{  
cin.getline(send_buf, 256);  
cin.clear();    //NOTE: If not clear, when input size overflow, getline will fail the next time.  


if ( 0 == stricmp(send_buf, "quit") || 0 == stricmp(send_buf, "exit") ) 
{
break;  
}


err = send(sock, send_buf, strlen(send_buf) + 1, 0);  
if ( SOCKET_ERROR == err )  
{  
cout<<"send error: "<<WSAGetLastError()<<endl;  
}  


err = recv(sock, recv_buf, sizeof(recv_buf), 0);  
if ( err <= 0 )  
{  
cout<<"recv error: "<<WSAGetLastError()<<endl;  
}  


cout<<recv_buf<<endl;  
}  


err = closesocket(sock);  
if ( SOCKET_ERROR == err )  
{  
cout<<"closesocket error: "<<WSAGetLastError()<<endl;  
}  
WSACleanup();  


return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值