socket编程学习---(五)

####MSG_PEEK 处理粘包问题

ssize_t recv_peek(int sockfd ,void *buf ,size_t len)
{
      while(1)
      {
      int ret = recv(sockfd ,buf,len,MSG_PEEK);
         if(ret == -1 && errno == EINTR)
                  continue;
         return ret;
	  }
}

ssize_t recv_peek(int sockfd ,void *buf ,size_t maxline)
{
	int ret;
	int nread;
	char *bufp = buf;
	int nleft = maxline; //一行不能超过maxline
	while(1)
	{
	     ret = recv_peek(sockfd,bufp,nleft);
	     if(ret < 0) 
	           return ret ;
	     else if(ret == 0)  //对方关闭
	           return ret;
	     nread = ret;
	     int i;
	     for(i=0;i<nread;i++)
	     {
	              if(bufp[i] == '\n')
	              {
	                ret = readn(sockfd,bufp,i+1);
	                if(ret != i+1) 
	                        exit(EXIT_FAILURE);
	                return ret;
                  }
         }
         if(nread > nleft)
		         exit(EXIT_FAILURE);
		 nleft -=nread;
		 ret = readn(sockfd,bufp,nread);
		 if(ret != nread)
		           exit(EXIT_FAILURE);
		 bufp +=nread;
    }
    return -1;
}

服务器

char recvbuf[1024];
while(1)
{
	memset(recvbuf,0,sizeof(recvbuf));
	int ret = readline(conn,recvbuf,1024);
	if(ret == -1) ERR_EXIT("readline");
	if(ret == 0)
	{
	    printf("client close");
	    break;
    }
    //printf recvbuf
    writen(conn,recvbuf,strlen(recvbuf));
}

客户端

//
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
//从标准输入获得发送数据 结尾有\r\n
writen(sock,sendbuf,strlen(sendbuf));
int ret = readline(sock,recvbuf,sizeof(recvbuf));
if(ret == -1) ERR_EXIT("readline");
else if(ret == 0)
{
    printf("ser close");
    break;
}
//printf
memset(recvbuf,0,sizeof(recvbuf));
getsockname

获得套接口本地地址

int getsockname(int sockfd,struct sockaddr *addr,socklen_t addrlen)

//sock 要是已连接套接口

struct sockaddr_in localaddr;
socklen_t addrlen = sizeof(localaddr);
if( getsockname(sock,(struct sockaddr *)&localaddr,addrlen) < 0)
       ERR_EXIT("getsockname");
printf("ip:%s,port:%d",inet_ntoa(localaddr.sin_addr),ntohl(localaddr.sin_port));
getpeername

获得套接口对端地址 用法同上

#####gethostname
获得主机名称
#####gethostbyname
通过主机名称获得ip

char host[100];
if( gethostname(host,sizeof(host)) < 0)
       ERR_EXIT("gethostname");
struct hostent *hp;
if((hp = gethostbyname(host)) == NULL)
       ERR_EXIT("gethostbyname");
int i=0;
while( hp->h_addr_list[i] != NULL )
{
printf("%s",inet_ntoa(*(struct in_addr *)hp->h_addr_list[i]);
i++;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值