当时学网络编程的时候前两个实验都是在windowns上面用VS2015写的,这个程序客户端接收到消息并将服务器端的消息反转了一下
- 服务器端代码
#include<WS2tcpip.h>
#include<winsock.h>
#include <stdio.h>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest = MAKEWORD(1, 1);
int err;
err = WSAStartup(myVersionRequest, &wsaData);//在windowns上使用socket需要先注册,以上就是注册代码
if (!err)
{
printf("等待连接\n");
}
else
{
//进一步绑定套接字
printf("嵌套字未打开!");
return 0;
}
SOCKET serSocket = socket(AF_INET, SOCK_STREAM, 0);//创建了可识别套接字
SOCKADDR_IN peeraddr; //需要绑定的参数
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//ip地址
addr.sin_port = htons(1234);//绑定端口,端口一般比1024大,因为1-1024是常设端口
bind(serSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR));//绑定完成
listen(serSocket, 1);//其中第二个参数代表能够接收的最多的连接数
SOCKADDR_IN clientsocket;
int lenth = sizeof(SOCKADDR);
SOCKET serConn = accept(serSocket, (SOCKADDR*)&clientsocket, &lenth);
char *sendBuf;
int x;
sendBuf = (char*)malloc(sizeof(char) * 100);
char s1[100] = "this is zlh in 2-1003";
sendBuf = s1;
//sprintf(sendBuf, "this is zlh in 2-1003", inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
send(serConn, sendBuf, strlen(sendBuf) + 1, 0);
x = sizeof(SOCKADDR);
getsockname(serConn, (SOCKADDR*)&addr,&x );
printf("本地ip地址:%s,本地端口:%d.\n", inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
int len = sizeof(peeraddr);
getpeername(serConn, (SOCKADDR*)&peeraddr, &x);
printf("客户端ip:%s,客户端端口:%d\n", inet_ntoa(clientsocket.sin_addr),ntohs(clientsocket.sin_port));
char receiveBuf[100];//接收
recv(serConn, receiveBuf, strlen(receiveBuf) + 1, 0);
printf("%s\n", receiveBuf);
closesocket(serConn);//关闭
WSACleanup();//释放资源的操作
return 0;
}
- 客户端代码
#include<WS2tcpip.h>
#include<winsock.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main(int argc,char argv[]) {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
perror("WSAStartup error");
} //在windowns上使用socket需要先注册,以上就是注册代码
char buf[100];//消息接收
SOCKADDR_IN server;
SOCKADDR_IN peeraddr;
SOCKET socketfd = socket(AF_INET, SOCK_STREAM, 0);
ZeroMemory(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(1234);
server.sin_addr.S_un.S_addr = inet_addr("127.0.0.2");
connect(socketfd, (SOCKADDR*)&server, sizeof(SOCKADDR));
recv(socketfd, buf, 101, 0);
int x = sizeof(SOCKADDR);
getsockname(socketfd, (SOCKADDR*)&server,&x );
printf("本地ip地址:%s,本地端口:%d.\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port));
socklen_t len = sizeof(peeraddr);
getpeername(socketfd, (SOCKADDR*)&peeraddr, &x);
printf("服务器ip:%s,服务器端口:%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));
printf("%s\n", buf);
int i=strlen(buf);
char newbuf[100];
for (int j = 0; j < i; j++) {
newbuf[j] = buf[i-j-1];
}
newbuf[i] = '\0';
send(socketfd, newbuf, strlen(newbuf) + 1, 0);
closesocket(socketfd);
WSACleanup();
return 0;
}
- 运行结果
服务器端:
客户端: