Linux 下server端和windows下client端通信

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao5502169/article/details/89714998

最近看了《TCP/IP网络编程》这本书。
正好又租了台阿里云的服务器,发现把TCP端口全部打开后,就可以实现本地与云服务器的通信了。

主要时利用socket进行通信,实现一个简单的计算功能。代码有点丑。。

op_server.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUF_SIZE (1024)
int caculate(char *str);
void error_handling(const char *message);
int main(int argc,char *argv[]){
	int serv_sock;
	int clnt_sock;
	int str_len;
	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;
	char message[BUF_SIZE];
	if(argc != 2){
		printf("Usage :%s <port>\n",argv[0]);
		exit(1);
	}

	serv_sock = socket(PF_INET,SOCK_STREAM,0);
	if(serv_sock == -1)
		error_handling("socket() error");
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(atoi(argv[1]));

	if(bind(serv_sock,(struct sockaddr*) &serv_addr,sizeof(serv_addr)) == -1)
		error_handling("bind() error");
	if(listen(serv_sock,5) == -1)
		error_handling("listen() error");
	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept(serv_sock,(struct sockaddr*) &clnt_addr,&clnt_addr_size);
	if(clnt_sock == -1)
		error_handling("accept() error");
	str_len = read(clnt_sock,message,BUF_SIZE-1);
	if(str_len == -1)
		error_handling("read() error");
	int res = caculate(message);
	write(clnt_sock,(char*)&res,sizeof(res));
	close(clnt_sock);
	close(serv_sock);
		return 0;
} 
void error_handling(const char *message){
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}
int caculate(char *str){
	char *p = strtok(str,"|");
	int numCount = atoi(p);
	int *num = new int[numCount];
	for(int i=0;i<numCount;++i){
		p = strtok(NULL,"|");
		num[i] = atoi(p);
	}
	int res = num[0];
	p = strtok(NULL,"|");
	if(p[0] == '+')
		for(int i=1;i<numCount;++i)	res += num[i];
	else if(p[0] == '-')
		for(int i=1;i<numCount;++i)	res -= num[i];
	else if(p[0] == '*')
		for(int i=1;i<numCount;++i)	res *= num[i];
	else
		error_handling("operation error");
	return res;
}

op_client.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<WinSock2.h>
#define NUM_SIZE 110
#define BUF_SIZE 1024
using namespace std;
void ErrorHandling(const char* message);
int main(int argc, char* argv[]) {
	WSADATA wsaData;
	SOCKET hSocket;
	SOCKADDR_IN servAddr;
	string Msg;
	char replymessage[BUF_SIZE];
	char* message = nullptr;
	int num[NUM_SIZE],NumCount;
	char op;
	int strLen;
	if (argc != 3) {
		printf("Usage :%s <IP> <PORT>\n", argv[0]);
		exit(1);
	}
	printf("%s %s\n", argv[1], argv[2]);
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error");
	hSocket = socket(PF_INET, SOCK_STREAM, 0);
	if (hSocket == INVALID_SOCKET)
		ErrorHandling("socket() error");
	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr(argv[1]);
	servAddr.sin_port = htons(atoi(argv[2]));
	if (connect(hSocket, (SOCKADDR*)& servAddr, sizeof(servAddr)) == SOCKET_ERROR)
		ErrorHandling("connect() error");
	printf("NumCount:");
	if (scanf("%d", &NumCount) == -1)
		ErrorHandling("NumCount error");
	Msg = to_string(NumCount);
	for (int i = 0; i < NumCount; ++i) {
		printf("number %d:", i + 1);
		if (scanf("%d", &num[i]) == -1) 
			ErrorHandling("read num error");
		Msg = Msg + "|" + to_string(num[i]);
	}
	printf("operation:");
	if (getchar() == -1)
		ErrorHandling("getchar() error");
	if (scanf("%c", &op) == -1)
		ErrorHandling("read op error");
	Msg = Msg + "|" + op;
	//message
	message = new char[Msg.size() + 5];
	strcpy(message, Msg.c_str());	
	int reply;
	if (send(hSocket, message,strlen(message)+1, 0) == -1)
		ErrorHandling("send() error");
	strLen = recv(hSocket,(char*)&reply,sizeof(reply), 0);
	if (strLen == -1 )
		ErrorHandling("recv() error");
	printf("res = %d\n", reply);
	closesocket(hSocket);
	WSACleanup();

	return 0;
}
void ErrorHandling(const char* message) {
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

猜你喜欢

转载自blog.csdn.net/zhao5502169/article/details/89714998