进程间通信 SOCKET Client

#include <stdlib.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <error.h>
#include <string.h>

int readnet( int sockid, register char *ptr, short nbytes) 
{
	
	int nleft=0,nread=0;
	fd_set          Readyfd;
	struct          timeval timeout;
	int             ret;
	nleft=nbytes;
	
	FD_ZERO(&Readyfd);
	FD_SET(sockid, &Readyfd);
	timeout.tv_sec = 0;
	timeout.tv_usec = 500000;//0.5秒
	
	ret = select(sockid+1, NULL, &Readyfd, NULL, &timeout);
	if(ret<=0)
	{
			return -1;
	}
	

	nleft=nbytes;
	while(nleft > 0) 
	{                            
		nread = read(sockid,ptr,nleft);
		if (nread <= 0 ) 
		{
			return (nread);
		}
		
		nleft -=nread;
		ptr +=nread;
	}
	return nbytes-nleft;
}


int Client()
{
		char buf[200] = {0};
		
		int iSockfd = socket(PF_INET,SOCK_STREAM,0);																		/*1. 准备socket*/
		if(iSockfd == -1)
		{
				
				return -1;
		}
		
		struct sockaddr_in addr;								
		addr.sin_family = PF_INET;
		
		addr.sin_port = htons(17777);
		inet_aton("127.0.0.1",&addr.sin_addr);
		
		//unsigned long ul = 1;
		//ioctl(iSockfd, FIONBIO, &ul); //设置为非阻塞模式
		
		struct          timeval timeout;
		timeout.tv_sec = 10;
		timeout.tv_usec = 500000;//0.5秒

		setsockopt(iSockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));  
		
		fd_set          Readyfd;
		int             ret;
		

		
		int iNum = 0;
		while(-1 == connect(iSockfd,(struct sockaddr*)&addr, sizeof(addr)))
		{
				iNum ++;
				printf("--------%d  次重连\n",iNum);
				sleep(1);
				if(iNum == 10)
				{
						printf("-----------连接失败\n");
						return -1;
				}
			
		}
		
		
		ret = select(iSockfd, NULL, &Readyfd, NULL, &timeout);
		//printf("--------Connect  =%d\n",iRes);
		printf("--------select =%d\n",ret);
		
		
		
		write(iSockfd,(char *)"hello world ,I'm Client", 100);
	
		//ret = select(iSockfd, NULL, &Readyfd, NULL, &timeout);
		printf("---------ret=%d\n",ret);
		int i;
		for( i=0;i<6;i++)
		{
				if(ret == 0)
				{
						int iRet = read(iSockfd, buf, 100);
						printf("---1----超时 次数:%d\n",i);
						if(iRet <= 0)
						{
								continue;
						}
						else
						{
								break;
						}
				}
				
				if(ret>0)
				{
						int iSet = 	FD_ISSET(iSockfd, &Readyfd);
						int iRet = read(iSockfd, buf, 100);
						printf("---2----超时 次数:%d\n",i);
				}
				
		}

		//int iRet = read(iSockfd, buf, 100);
		printf("-------buf=%s\n",buf);
		printf("--------------函数结束--------\n");
		return 0;
}	


int main()
{
		Client();
		return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值