版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}