linux网络 socket


学习 ing  linux 下的网络编程 

     在 入门的socket中 就碰了不少bbbbbb壁

           服务器   服务器的程序要开启(绑定   监听 )

           客户端    客户端去申请服务   

           服务器回应客户   (服务器可能同时 接收多个客户端的服务申请  所以有个服务器的监听队列    )

           该例子中用      accept的函数 使服务器进入睡眠  直到监听到有客户申请

                    问题是      “address already use ” 即使在使用 setsockopt之后,

                                      linux下的时间调用:来自http://wenwen.sogou.com/z/q311998900.htm

                                     Linux 套接字编程中的 5 个隐患:http://www.ibm.com/developerworks/cn/linux/l-sockpit/

                                      client段收到的时间后面有乱码:在srever.c 中的 write函数中写的大小 改为(strlen(buf)+1)  把'\0'写入

                                                                                                                                   或者直接写100 接收的 buf大小一致



#include "socket_includes.h"





int main(int argc, char *argv[])
{
	int sockfd;
	struct sockaddr_in servaddr;
	char buf[100];
	int bytes;
	
	if(( sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
	{
		perror("socket error");
		return -1;
	}
	
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family		=		AF_INET;
	servaddr.sin_addr.s_addr=		inet_addr("127.0.0.1");
	servaddr.sin_port		=		htons(9999); 
	      //改端口与服务器的端口对应。
	if( connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0 )
	{
		perror("connect error");
		return 0;
	}
	
	bytes = read(sockfd, buf,100);
	if(bytes < 0){
		printf("Error, read failed.\n");
		return -1;
		}

	if(0 == bytes){
		printf("Server close connection.\n");
		return -1;
		}
      
        printf("Time:%s\n",buf);
	
	//printf("Read bytes %d\n", bytes);
	
	close(sockfd);


}



#include "socket_includes.h"





int main(int argc, char *argv[])
{
	int listenfd, sockfd, opt = 1;
	struct sockaddr_in server, client;
	char buf[200];
	socklen_t len;
	time_t timep;//time_t结构
	int ret;
	
	listenfd = socket(AF_INET, SOCK_STREAM, 0);
                  if(listenfd < 0)
                 {      perror("Create socket fail.");
	                return -1;
                 }	
	 bzero(&server, sizeof(server));
          server.sin_family = AF_INET;
          server.sin_port   = htons(9999);
          //改端口与客户端 端口对应 若在调用setsockopt后还出现 “addres already use” 可以尝试换个端口 
          // 因为改端口可能被其他应用 占用 否则尝试关闭该端口在用
          server.sin_addr.s_addr  = htonl(INADDR_ANY);
	
	
          if(bind(listenfd, (struct sockaddr *)&server,sizeof(server))<0) 
                    //bind before listen 
        {
			        perror("bind error.");
              return -1;
          }
	
	  listen(listenfd, MAX_LISTEN_QUE);//queue of the listen 
	
	if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,(char *) &opt, sizeof(opt))) < 0)
                                 //for the  error "  Address already in use " when running 这里设置了端口可复用
         {
          		perror("Error, set socket reuse addr failed");	
          		return -1;
          }  
	
	len = sizeof(client);
	while(1){
		sockfd = accept(listenfd, (struct sockaddr *)&client, &len);
	        if(sockfd < 0){
				perror("accept error.");
				return -1;
	                       }
	  
		time(&timep);
		snprintf(buf, sizeof(buf), "%s", ctime(&timep));
		write(sockfd, buf,(strlen(buf)+1));  //若改为 strlen(buf)  client 打印会有乱码
		printf("Bytes:%d\n", strlen(buf));
		printf("sockfd=%d\n", sockfd);
                printf("time:%s",ctime(&timep));
		close(sockfd);
	}
	return 0;
	
}




#include 
   
   
    
    

#include 
    
    
     
     

#include 
     
     
      
      





#include 
      
      
       
       

#include 
       
       
        
        

#include 
        
        
          #include 
         
           #include 
          
            #include 
           
          
        
       
       
      
      
     
     
    
    
   
   














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值