linux用户自定义协议,linux下自定义协议防止粘包问题

/*************************************************************************

> File Name: test.c

> Author: kinght

> Mail: zhjnight@163.com

> Created Time: Wed 20 Jun 2018 06:58:02 PM PDT

************************************************************************/

#include

#include //connect,send,recv,setsockopt等

#include

#include // sockaddr_in, "man 7 ip" ,htons

#include //poll,pollfd

#include //inet_addr,inet_aton

#include //read,write

#include //gethostbyname

#include //perror

#include

#include //errno

#include // memset

#include

#include

#include

#ifdef HAVE_NETINET_IN_H

#include

#endif

#define ERR_EXIT(m)\

do\

{\

perror(m);\

exit(EXIT_FAILURE);\

}while(0)

struct packet

{

int len;

char buf[1024];

};

ssize_t readn(int fd,void *buf,size_t count)

{

//printf("%d\n",count);

size_t nleft = count;

ssize_t nread;

char *bufp = (char*)buf;

//fputs(bufp,stdout);

while(nleft>0)

{

nread = read(fd,bufp,nleft);

//printf("%d\n",nread);

//fputs(bufp,stdout);

if(nread <0)

{

if(errno = EINTR)

{

return -1;

}

}

else if(nread == 0)

{

break;

}

else

{

bufp += nread;

nleft -= nread;

}

}

}

ssize_t written(int fd,void *buf,size_t count)

{

//printf("%d",count);

size_t nleft = count;

ssize_t nwritten;

char *bufp = (char*)buf;

//fputs(bufp,stdout);

while(nleft>0)

{

nwritten = write(fd,bufp,nleft);

if(nwritten <0)

{

if(errno = EINTR)

{

return -1;

}

}

else if(nwritten == 0)

{

continue;

}

else

{

bufp += nwritten;

nleft= nleft -nwritten;

//printf("%d",nleft);

}

}

}

void doServiceConn(int conn)

{

/*char recvbuf[1024];

while(true)

{

memset(recvbuf,0,sizeof(recvbuf));

int ret = readn(conn,recvbuf,4);

if(ret == 0)

{

printf("client close");

break;

}

else if(ret == -1)

{

ERR_EXIT("read");

}

written(conn,recvbuf,sizeof(recvbuf));

printf(recvbuf,stdout);

}*/

struct packet recvbuf;

memset(&recvbuf,0,sizeof(recvbuf));

int n;

while(true)

{

int ret = readn(conn,&recvbuf.len,4);

if(ret == -1)

ERR_EXIT("read");

else if(ret < 4)

{

printf("peer close");

break;

}

n= ntohl(recvbuf.len);

ret = readn(conn,recvbuf.buf,n);

if(ret == -1)

{

ERR_EXIT("read");

}

else if(ret < n)

{

printf("client close");

break;

}

fputs(recvbuf.buf,stdout);

written(conn,&recvbuf,4+n);

}

}

int main(void)

{

int listenfd;

if((listenfd =socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)

{

ERR_EXIT("ERROR");

}

struct sockaddr_in servaddr;

memset(&servaddr,0,sizeof(servaddr));

servaddr.sin_family=AF_INET;

servaddr.sin_port = htons(5188);

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

int on = 1;

if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))< 0)

{

ERR_EXIT("SETSOCKOPT");

}

if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))< 0)

{

ERR_EXIT("error");

}

if(listen(listenfd,SOMAXCONN)<0)

{

ERR_EXIT("listen");

}

struct sockaddr_in peeraddr;

socklen_t peerlen = sizeof(peeraddr);

int conn;

pid_t pid;

while(1)

{

conn = accept(listenfd,(struct sockaddr*)&peeraddr,&peerlen);

if(conn < 0)

{

ERR_EXIT("accept");

}

printf("ip= %s,port = %d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));

pid = fork();

if(pid == -1)

ERR_EXIT("fork");

if(pid == 0)

{

close(listenfd);

doServiceConn(conn);

exit(EXIT_SUCCESS);

}

else

{

close(conn);

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值