linux 服务器间通信,使用Linux实现客户端和服务端之间的通信

该博客介绍了如何使用C语言实现一个客户端程序,通过socket通信连接到指定服务器,接收并发送带有不同类型信息的客户端数据,如聊天消息和棋局操作。重点在于服务器地址解析、信息打包和错误处理。

[C] 纯文本查看 复制代码#include

#include

#include

#include

#include

#include

#include

#include"Statement.h"

#define oops(msg) {perror(msg);exit(1);}

void makeServerAddr(struct sockaddr_in *addr,char *hostname,char *port);

void packInfo(MSGSTRUCT *msg,char info[],int cNum);

int main(int agc,char *agv[])

{

if(agc!=4)

{

printf("use ./ClientFive name port clientId\n");

exit(1);

}

struct sockaddr_in servadd;

int sock_id;

char info[BUFSIZ];

int infolen;

sock_id=socket(AF_INET,SOCK_STREAM,0);

if(sock_id==-1)

{

oops("socket");

}

makeServerAddr(&servadd,agv[1],agv[2]);

if(connect(sock_id,(struct sockaddr *)&servadd,sizeof(servadd))!=0)

oops("connect");

//printf("sock_id=%d\n",sock_id);

//

//send info to server

printf("please input your info\n");

MSGSTRUCT msg;

char receBuf[BUFSIZ];

while(1)

{

memset(info,'\0',strlen(info));

memset(&msg,'\0',sizeof(msg));

fgets(info,BUFSIZ,stdin);

//packing cllient info

packInfo(&msg,info,atoi(agv[3]));

//send msg

if(write(sock_id,&msg,sizeof(MSGSTRUCT))!=sizeof(MSGSTRUCT))

{

oops("write")

}

//receve msg

read(sock_id,receBuf,BUFSIZ);

printf("\t\tserver:%s\n",receBuf);

}

return 0;

}

void makeServerAddr(struct sockaddr_in *addr,char *hostname,char *port)

{

bzero(addr,sizeof(struct sockaddr_in));

struct hostent *hp;

hp=gethostbyname(hostname);

if(hp==NULL)

{

oops(hostname);

}

bcopy(hp->h_addr,(struct sockaddr *)&(addr->sin_addr),hp->h_length);

// inet_pton(AF_INET,hostname,&(addr->sin_addr));

// inet_pton(AF_INET,"127.0.0.1",&(addr->sin_addr));

addr->sin_port=htons(atoi(port));

addr->sin_family=AF_INET;

}

void packInfo(MSGSTRUCT *msg,char info[],int cNum)

{

char *type=NULL;

int typeNum=0;

char *msgInfo=NULL;

type=strtok(info,";");

typeNum=atoi(type);

printf("type=%d",typeNum);

msg->clientNum=cNum;

switch(typeNum)

{

//落字消息

case 1:

msg->msgType=1;

msg->x=1;

msg->y=2;

break;

//和棋消息

case 2:

msg->msgType=2;

break;

//同意和棋

case 3:

msg->msgType=3;

break;

//拒绝和棋

case 4:

msg->msgType=4;

break;

//聊天消息

case 5:

msg->msgType=5;

strcpy(&(msg->byMsg),strtok(NULL,";"));

break;

default:

perror("input message type is error!\n");

exit(1);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值