服务器端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define server_port 5000
#define MAXPENDING 1000
struct USERDATA
{
char name[30];
char passwd[30];
};
int HandleTCPClient(int clntSocket,struct USERDATA *userdata);
int HandleTCPClient(int clntSocket,struct USERDATA *userdata)
{
char buffer[BUFSIZ];
ssize_t numBytesRcvd = recv(clntSocket,buffer,BUFSIZ-1,0);
if(numBytesRcvd < 0)
{
fputs("recv() failed!\n",stderr);
send(clntSocket,"false",(size_t)strlen("false"),0);
return -1;
}
//printf("num = %d\n",strlen(buffer));
memcpy(userdata,buffer,sizeof(struct USERDATA));
// 第三个属性的长度不能超过第一个属性的存储空间否则会出现内存非法。
return 0;
}
void main()
{
int servSock;
if((servSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
{
printf("socket() failed!\n");
exit(1);
}
struct sockaddr_in servAddr;
memset(&servAddr,0,sizeof(servAddr)) ;
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(server_port);
if(bind(servSock,(struct sockaddr *)&servAddr,sizeof(servAddr)) <0)
{
printf("bind() failed!\n");
exit(1);
}
if(listen(servSock,MAXPENDING) < 0)
{
printf("listen() failed!\n");
exit(1);
}
for(;;)
{
struct sockaddr_in clntAddr;
socklen_t clntAddrLen = sizeof(clntAddr);
int clntSock = accept(servSock,(struct sockaddr *)&clntAddr,&clntAddrLen);
if(clntSock < 0)
{
fputs("accpet() failed!\n",stderr);
continue;
}
char clntName[INET_ADDRSTRLEN];
if(inet_ntop(AF_INET,&clntAddr.sin_addr.s_addr,clntName,sizeof(clntName)) == NULL)
fputs("Unable to get client address!\n",stderr);
struct USERDATA userdata;
int result = HandleTCPClient(clntSock,&userdata);
if(result < 0)
{
send(clntSock,"false",(size_t)strlen("false"),0);
close(clntSock);
}
else
{
send(clntSock,"true",(size_t)strlen("true"),0);
close(clntSock);
puts(userdata.name);
puts(userdata.passwd);
}
}
}
客户端代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
struct USERDATA
{
char name[30];
char passwd[30];
};
void DieWithUserMessage(const char *msg,const char *detail);//错误处理
void DieWithSystemMessage(const char *msg);//错误处理
void DieWithUserMessage(const char *msg,const char *detail){
fputs(msg,stderr);
fputs(": ",stderr);
fputs(detail,stderr);
fputc('\n',stderr);
exit(1);
}
void DieWithSystemMessage(const char *msg){
perror(msg);
exit(1);
}
int main(){
char *servIP = "139.129.39.100";
in_port_t servPort = 5000;
int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock < 0)
DieWithSystemMessage("socket() failed!\n");
struct sockaddr_in servAddr;
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family = AF_INET;
int rtnVal = inet_pton(AF_INET,servIP,&servAddr.sin_addr.s_addr);
if(rtnVal == 0)
DieWithUserMessage("inet_pton() failed!","invalid address string");
servAddr.sin_port = htons(servPort);
if(connect(sock,(struct sockaddr *)&servAddr,sizeof(servAddr)) < 0)
DieWithSystemMessage("connect() failed!\n");
struct USERDATA userdata;
memcpy(userdata.name,"kakarot",sizeof("kakarot"));
memcpy(userdata.passwd,"1235656",sizeof("1235656"));
puts(userdata.name);
puts(userdata.passwd);
ssize_t numBytes = send(sock,(char *)&userdata,sizeof(userdata),0);
if(numBytes < 0)
DieWithSystemMessage("send() failed!\n");
else if(numBytes != sizeof(userdata))
DieWithUserMessage("send()","sent unexpected number of bytes");
//unsigned int totalBytesRcvd = 0;
fputs("Received: ",stdout);
char buffer[BUFSIZ];
numBytes = recv(sock,buffer,BUFSIZ -1,0);
if(numBytes < 0)
DieWithSystemMessage("recv() failed!\n");
else if(numBytes == 0)
DieWithUserMessage("recv()","connection closed prematurely!");
//totalBytesRcvd += numBytes;
// puts(buffer);
int creatResult = strcmp(buffer,"false");
if(creatResult > 0)
{
puts("true");
}
else
{
puts("false");
}
// fputs(buffer,stdout);
fputc('\n',stdout);
close(sock);
exit(0);