因为参加某场测试偶然拿到了这样一个题目
之前完全没有接触过计算机网络问题 写的比较粗糙 发上来做个记录日后进行优化
主体思想如图
根据服务器与客户端的此原理以及 传入传出函数
Ò
recv
()/send()
Ò
send(
int
sockfd
,
const
void *
buf
,
size_t
len
,
int
flags
);
Ò
recv
(
int
sockfd
,void *
buf
,
size_t
len
,
int
flags
);
代码如下
/****************
服务器
****************/
#include <stdio.h>
#include <winsock2.h>
#define SERVER_PORT 1234
int main()
{
WORD sockversion = MAKEWORD(2,2);
WSADATA wasdata;
if(WSAStartup(sockversion,&wasdata)!=0)
{
printf("函数库设置失败\n");
exit(1);
}
SOCKET sListen,sServer;
sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("socket创建失败\n");
WSACleanup();
exit(1);
}
struct sockaddr_in saserver,saclient;
saserver.sin_family = AF_INET;
saserver.sin_port = htons(SERVER_PORT);
saserver.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if(bind(sListen,(struct sockaddr*)&saserver,sizeof(saserver))==SOCKET_ERROR)
{
printf("绑定错误!\n");
closesocket(sListen);
WSACleanup();
exit(1);
}
if(listen(sListen,5)==SOCKET_ERROR)
{
printf("侦听发生错误!\n");
closesocket(sListen);
WSACleanup();
exit(1);
}
printf("jojo:程序已启动等待连接中\n");
int length;
char message[500];
char *ptr;
int judge;
while(1)
{
length = sizeof(saclient);
sServer = accept(sListen,(struct sockaddr*)&saclient,&length);
if(sServer == INVALID_SOCKET)
{
printf("连接失败");
closesocket(sListen);
WSACleanup();
exit(1);
}
printf("收到连接:%s\n",inet_ntoa(saclient.sin_addr));
ptr = message;
left =sizeof(message);
while(1)
{
judge = recv(sServer,ptr,500,0);
// printf("judge = %d",judge);
if(judge==SOCKET_ERROR)
{
printf("连接出现问题");
exit(1);
}
if(judge==0)
{
printf("该客户已下线");
break;
}
// left = left-judge;
// ptr = ptr+judge;
// printf("\nleft =%d",left);
printf("收到消息: %s\n",message);
message[judge] = 0x00;
// printf("%c\n",message[judge]);
if(strcmp(message,"ADD")==0)
{
double x,y,z;
recv(sServer,(char*)&x,sizeof(double),0);
recv(sServer,(char*)&y,sizeof(double),0);
z = x+y;
send(sServer,(char*)&z,sizeof(double),0);
continue;
}
else if(strcmp(message,"DELETE")==0)
{
double x,y,z;
recv(sServer,(char*)&x,sizeof(double),0);
recv(sServer,(char*)&y,sizeof(double),0);
z = x-y;
send(sServer,(char*)&z,sizeof(double),0);
continue;
}
else if(strcmp(message,"MULTIPLY")==0)
{
double x,y,z;
recv(sServer,(char*)&x,sizeof(double),0);
recv(sServer,(char*)&y,sizeof(double),0);
z = x*y;
send(sServer,(char*)&z,sizeof(double),0);
continue;
}
else if(strcmp(message,"DIVIDE")==0)
{
double x,y,z;
recv(sServer,(char*)&x,sizeof(double),0);
recv(sServer,(char*)&y,sizeof(double),0);
z = x/y;
send(sServer,(char*)&z,sizeof(double),0);
continue;
}
char senddata[500];
printf("please say some thing to him/her?:\n");
scanf("%s",senddata);
send(sServer,senddata,500,0);
}
}
}
/**********************
server
**********************/
#include <stdio.h>
#include <winsock2.h>
#define SERVER_PORT 1234
int main()
{
WORD sockversion = MAKEWORD(2,2);
WSADATA wasdata;
if(WSAStartup(sockversion,&wasdata)!=0)
{
printf("函数库初始化失败\n");
exit(1);
}
SOCKET sClient;
sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("初始化失败\n");
WSACleanup();
exit(1);
}
struct sockaddr_in saserver;
saserver.sin_family = AF_INET;
saserver.sin_port = htons(SERVER_PORT);
saserver.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(connect(sClient,(struct sockaddr*)&saserver,sizeof(saserver))==SOCKET_ERROR)
{
printf("conection failed");
closesocket(sClient);
WSACleanup();
exit(1);
}
while(1)
{
char *senddata;
char array[500];
printf("jojo:please enter words that you want to say to jojo\n");
printf("Hint: if you are going to use online calculating\n");
printf("Input coomand:ADD as +,DELETE as -,MULTIPLY as *,DIVIDE as /\n");
printf("Following inputs can be decimal which should be seperated by a space \n");
scanf("%s",array);
senddata = array;
send(sClient,senddata,sizeof(array),0);
if(strcmp(array,"ADD")==0)
{
double x,y,z;
scanf("%lf%lf",&x,&y);
send(sClient,(char*)&x,sizeof(double),0);
send(sClient,(char*)&y,sizeof(double),0);
recv(sClient,(char*)&z,sizeof(double),0);
printf("your result is:%lf\n\n",z);
continue;
}
else if(strcmp(array,"DELETE")==0)
{
double x,y,z;
scanf("%lf%lf",&x,&y);
send(sClient,(char*)&x,sizeof(double),0);
send(sClient,(char*)&y,sizeof(double),0);
recv(sClient,(char*)&z,sizeof(double),0);
printf("your result is:%lf\n\n",z);
continue;
}
else if(strcmp(array,"MULTIPLY")==0)
{
double x,y,z;
scanf("%lf%lf",&x,&y);
send(sClient,(char*)&x,sizeof(double),0);
send(sClient,(char*)&y,sizeof(double),0);
recv(sClient,(char*)&z,sizeof(double),0);
printf("your result is:%lf\n\n",z);
continue;
}
else if(strcmp(array,"DIVIDE")==0)
{
double x,y,z;
scanf("%lf%lf",&x,&y);
if(y==0){ printf("error!\n%lf should not divided by 0",x);
continue;}
send(sClient,(char*)&x,sizeof(double),0);
send(sClient,(char*)&y,sizeof(double),0);
recv(sClient,(char*)&z,sizeof(double),0);
printf("your result is:%lf\n\n",z);
continue;
}
printf("your input is %s\n",array);
int ret;
char recvdata[500];
ret = recv(sClient,recvdata,500,0);
if(ret>0)
{
recvdata[ret]= 0x00;
printf("receive message from jojo :%s\n\n",recvdata);
}
}
return 0;
}
注意一般要加入#pragma comment(lib,"ws2_32.lib")
我使用的codeblock环境在编译器设置里添加了libws2_32.a 和libwsock.a