您的位置:首页 > 运维架构 > Linux

linux下简易socket编程

2015-09-11 12:35 721 查看
最近研究了一下linux下的socket编程。这里写一个简易的版本上去。主要是分client和server两个部分。

对于client比较简单,这里仅做一个简单的client。可以给自己的server发送一条消息并且可以得到一条服务器返回的消息,之后结束进程。

#include
#include
#include
#include
#include
#include

#define MAXNUM 255
#define BINDPORT 8000
int main(int argc, char** argv)
{
int iSocketFd;
int iRecvLen; //用来获取返回的字符串长度
char cRecvMsg[MAXNUM]; //用来获取由服务器传来的信息
char cSendMsg[MAXNUM];
struct sockaddr_in Saddr;

if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket init error");
exit(0);
}

memset(&Saddr, 0, sizeof(Saddr));
Saddr.sin_family = AF_INET; //代表用的ipv4协议
Saddr.sin_port = htons(BINDPORT);

//用来获取主机server的IP地址
if(inet_pton(AF_INET, argv[1], &Saddr.sin_addr) <= 0)
{
printf("inet_pton error");
exit(0);
}

if(connect(iSocketFd, (struct sockaddr*) &Saddr, sizeof(Saddr)) < 0)
{
printf("connect error");
exit(0);
}
//读取一行作为传送给server的信息
fgets(cSendMsg, MAXNUM, stdin);
if(send(iSocketFd, cSendMsg, strlen(cSendMsg), 0) < 0)
{
printf("send error");
exit(0);
}

if((iRecvLen = recv(iSocketFd, cRecvMsg, MAXNUM, 0)) < 0)
{
printf("receive error");
exit(0);
}
cRecvMsg[iRecvLen] = '\0'; //将收到的信息末端添加\0以便输出。
printf("received:%s", cRecvMsg);
close(iSocketFd);
return 0;
}
对于server。中间采用了调用子进程来进行收发消息的机制,这样如果扩展可以用来并发的接待多位client.

#include
#include
#include
#include
#include
#include
#include
#include

#define BINDPORT 8000

int handleMsg(int iConnectFd);
int main(int argc, char ** argv)
{
int iSocketFd, iConnectFd;
struct sockaddr_in Saddr;
char cServerAns[40] = "Server received Msg";
char cMsg[255];
pid_t pid;
if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error");
exit(0);
}

memset(&Saddr, 0, sizeof(Saddr));
Saddr.sin_family = AF_INET;
Saddr.sin_addr.s_addr = htonl(INADDR_ANY);
Saddr.sin_port = htons(BINDPORT);

if(bind(iSocketFd, (struct sockaddr*)&Saddr, sizeof(Saddr)) < 0)
{
printf("bind error");
}
if(listen(iSocketFd, 10) < 0)
{
printf("listen socket error");
exit(0);
}
while(true)
{
if((iConnectFd = accept(iSocketFd, (struct sockaddr*)NULL, NULL)) < 0)
{
printf("accept socket error");
}
pid = fork();
if(pid < 0)
{
printf("fork error");
exit(0);
}
else if(pid == 0)           //调用子进程进行收发信息
{
handleMsg(iConnect_fd);
close(iConnectFd);
}
else if(pid > 0)
{
close(iConnectFd);
}
}
close(iSocketFd);
}
int handleMsg(int iConnectFd)
{
char cTime[255];
char cRecvMsg[255];
int iRecvLen;
int iMsgLen;
time_t now;
iRecvLen = recv(iConnectFd, cRecvMsg, 255,0);
cRecvMsg[iRecvLen] = '\0';
now = time(0);
strftime(cTime, 255, "%Y.%m.%d_%H:%M:%S", localtime(&now));
printf("%s %d %s", cTime, getpid(), cRecvMsg);              //打印当前时间 子进程号 收到的信息

if(send(iConnectFd, "you are connected!\n", 19, 0) < 0)
{
printf("send error");
exit(0);
}
}

基本就是这样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: