先开启服务端,在开启客户端。向服务端命令窗口输入字符,按ENTER键,则字符发送子客户端。之后客户端也可以发送字符至服务端。
服务端程序:
#include <WINSOCK2.H>
#include <iostream.h>
main()
{
SOCKET socknum, sendsocknum; //socket描述符
struct sockaddr_in serveraddr, clientaddr; //服务器地址结构体
char* IPstring = "172.16.192.185"; //字符串形式的服务器IP地址
int IP; //32位整形IP地址
IP = inet_addr(IPstring); //字符串形式的IP地址转换成32位整形IP地址
WSADATA wsaData;
WORD version = MAKEWORD(2,0);
WSAStartup(version,&wsaData);
WSASetLastError(963);
cout<<"WSAGetLastError="<<WSAGetLastError()<<endl;
socknum = socket(PF_INET,SOCK_STREAM,0); //创建一个套接字,并且返回描述符
if(SOCKET_ERROR == socknum)
{
exit(0);
}
memset(&serveraddr, 0, sizeof(struct sockaddr_in));
//填充服务器地址结构体的内容
serveraddr.sin_family = AF_INET; //填充协议地址
serveraddr.sin_addr.s_addr = IP; //填充IP地址
serveraddr.sin_port = htons(4000); //填充端口号
//绑定到服务器的指定网络地址
int b; //当返回值为-1,说明绑定失败
b = bind(socknum, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in));
//监听
int c , d=sizeof(clientaddr); //当返回值为-1,说明绑定失败
c = listen(socknum, 6);
//若b=-1,c=-1,说明绑定和监听都失败
cout<<"socknum="<<socknum<<endl<<"b="<<b<<endl<<"c="<<c<<endl<<"IP="<<IP<<endl;
sendsocknum = accept(socknum, (struct sockaddr *)&clientaddr,&d);
char SendBuffer[100];
char RevBuffer[100];
cout<<"客户端IP地址:"<<inet_ntoa((clientaddr.sin_addr))<<endl;
while(1)
{
cin>>SendBuffer;
send(sendsocknum, SendBuffer, strlen(SendBuffer), 0);
memset(SendBuffer, 0, 100);
// shutdown(sendsocknum, 1);
memset(RevBuffer, 0, 100);
recv(sendsocknum, RevBuffer, 100, 0);
cout<<RevBuffer<<endl;
}
while(1);
closesocket(sendsocknum);
WSACleanup();
}
客户端程序:
#include <WINSOCK2.H>
#include <iostream.h>
main()
{
SOCKET clientsocknum;
struct sockaddr_in serveraddr, clientaddr;
char *IPstring = "172.16.192.185";
int IP, b, len;
IP = inet_addr(IPstring);
WSADATA wsaData;
WORD version = MAKEWORD(2,0);
WSAStartup(version,&wsaData);
clientsocknum = socket(AF_INET,SOCK_STREAM,0);
memset(&serveraddr, 0, sizeof(struct sockaddr_in));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = IP;
serveraddr.sin_port = htons(4000);
b = connect(clientsocknum, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in));
getsockname(clientsocknum, (sockaddr*)(&clientaddr),&len);
cout<<"本地地址:"<<inet_ntoa(clientaddr.sin_addr)<<endl<<"本地端口:"<<htons(clientaddr.sin_port)<<endl;
cout<<"clientsocknum="<<clientsocknum<<endl<<"b="<<b<<endl;
char RecvBuffer[100];
char sendbuffer[100] ;
memset(RecvBuffer, 0, 100);
int recvnum;
while(1)
{
recvnum = recv(clientsocknum, RecvBuffer, 100, 0);
cout<<RecvBuffer<<endl;
memset(RecvBuffer, 0, 100);
cin>>sendbuffer;
send(clientsocknum, sendbuffer, strlen(sendbuffer), 0);
memset(sendbuffer, 0, 100);
}
closesocket(clientsocknum);
WSACleanup();
}