基本TCP实现(windowns)

当时学网络编程的时候前两个实验都是在windowns上面用VS2015写的,这个程序客户端接收到消息并将服务器端的消息反转了一下

  1. 服务器端代码
#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;
}
  1. 客户端代码
#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;
	}
  1. 运行结果
    服务器端:在这里插入图片描述
    客户端:在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/z1041259928/article/details/88053971