TCP/UDP服务器listen与recvfromd函数的顺序所致的问题

服务端写了两个套接字,分别接收udp和tcp

listen若写在recvfrom之前,服务端只能收到udp,而客户端会提示connect错误

于是检查了accept函数,并没有发现问题

将listen放在recvfrom之前就解决了,原因未明难过

代码如下:

客户端

<pre name="code" class="html">#include <stdio.h>  
#include <unistd.h>  
#include <string.h>  
#include <stdlib.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
#include <netinet/in.h>
#define MAXSIZE	1024  
int main(int argc, char *argv[])  
{  
    unsigned short port_tcp= 8004; 
	unsigned short port_udp= 8001;             
    char *server_ip = "192.168.115.233"; //服务器_ip    
    //创建套接字_tcp  
    int sockfd_tcp = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd_tcp < 0)  
    {  
        perror("socket");  
        exit(-1);  
    }  
    //创建套接字_udp 
	int sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0);    
    if(sockfd_udp < 0)  
    {  
        perror("socket");  
        exit(-1);  
    }  
	//服务器地址结构_tcp
    struct sockaddr_in server_addr_tcp;  	
    bzero(&server_addr_tcp,sizeof(server_addr_tcp)); 
    server_addr_tcp.sin_family = AF_INET;   
    server_addr_tcp.sin_port = htons(port_tcp); 
    inet_pton(AF_INET, server_ip, &server_addr_tcp.sin_addr);
	//服务器地址结构_udp
    struct sockaddr_in server_addr_udp;  
    bzero(&server_addr_udp,sizeof(server_addr_udp)); 
    server_addr_udp.sin_family = AF_INET;   
    server_addr_udp.sin_port = htons(port_udp); 
    inet_pton(AF_INET, server_ip, &server_addr_udp.sin_addr); 


	//发送_udp
	printf("send udp data to %s:%d\n",server_ip,port_udp); 
	char send_buf_udp[MAXSIZE] = "Hi, I am udp.";
	sendto(sockfd_udp, send_buf_udp, strlen(send_buf_udp), 0, (struct sockaddr*)&server_addr_udp, sizeof(server_addr_udp));
	//关闭_udp         
	close(sockfd_udp); 
	//连接服务器_tcp
	int err_log_tcp= connect(sockfd_tcp, (struct sockaddr*)&server_addr_tcp, sizeof(server_addr_tcp));
	if(err_log_tcp!= 0) {  
        perror("connect");  
        close(sockfd_tcp);  
        exit(-1);  
   	} 
	//发送_tcp
	printf("send tcp data to %s:%d\n",server_ip,port_tcp);           
    <span style="white-space:pre">	</span>char send_buf_tcp[MAXSIZE] = "Hi, I am tcp.";
	send(sockfd_tcp, send_buf_tcp, strlen(send_buf_tcp), 0);
	printf("send_buf_tcp is%s:\n",send_buf_tcp);				  		
	//关闭_tcp
	close(sockfd_tcp);   	
    <span style="white-space:pre">	</span>return 0;  
}  

服务端(修改后)

#include <stdio.h>  
#include <unistd.h>  
#include <string.h>  
#include <stdlib.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
#include <netinet/in.h>
#define MAXSIZE	1024  
int main(int argc, char *argv[])  
{  
    unsigned short port_tcp= 8004; 
    unsigned short port_udp= 8001;             
    char *server_ip = "192.168.115.233";       
    //创建tcp套接字
    int sockfd_tcp;  
    sockfd_tcp = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd_tcp < 0){  
        perror("socket");  
        exit(-1);  
    }   
	//创建udp套接字     
	int sockfd_udp; 
	sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0);   
       if(sockfd_udp < 0){  
        perror("socket");  
        exit(-1);  
        }
    //tcp服务端地址结构  	
    struct sockaddr_in server_addr_tcp;  
    bzero(&server_addr_tcp,sizeof(server_addr_tcp)); 
    server_addr_tcp.sin_family = AF_INET;   
    server_addr_tcp.sin_port = htons(port_tcp); 
    inet_pton(AF_INET, server_ip, &server_addr_tcp.sin_addr);
    struct sockaddr_in client_addr_tcp;	
    //tcp客户端的地址结构                 
    socklen_t client_addr_tcp_len = sizeof(client_addr_tcp);	
   struct sockaddr_in server_addr_udp;  
    //udp服务端地址结构
    bzero(&server_addr_udp,sizeof(server_addr_udp)); 
    server_addr_udp.sin_family = AF_INET;   
    server_addr_udp.sin_port = htons(port_udp); 
    inet_pton(AF_INET, server_ip, &server_addr_udp.sin_addr);
   //udp客户端的地址结构 
    struct sockaddr_in client_addr_udp;                
    socklen_t client_addr_udp_len = sizeof(client_addr_udp);		
    //绑定_udp 
    int err_log_udp= bind(sockfd_udp, (struct sockaddr*)&server_addr_udp, sizeof(server_addr_udp));  
    if(err_log_udp!= 0){  
        perror("bind");  
        close(sockfd_udp);        
        exit(-1);  
    } 
    //绑定_tcp
    int err_log_tcp = bind(sockfd_tcp, (struct sockaddr*)&server_addr_tcp, sizeof(server_addr_tcp));
    if( err_log_tcp!= 0){  
        perror("binding");  
        close(sockfd_tcp);        
        exit(-1);  
    }	
    printf("监听tcp客户端的端口是:%d\n",port_tcp);
    //监听_tcp        
    err_log_tcp= listen(sockfd_tcp, 10); 
    if(err_log_tcp!= 0){  
        perror("listen");  
        close(sockfd_tcp);        
        exit(-1);  
    }           
   printf("监听udp客户端的端口是:%d\n",port_udp);	
   //接收_udp 	
    char recv_buf_udp[MAXSIZE] = "";                  
    recvfrom(sockfd_udp, recv_buf_udp, sizeof(recv_buf_udp), 0, (struct sockaddr*)&client_addr_udp, &client_addr_udp_len);
    printf("receive udp data:%s\n",recv_buf_udp);	
    close(sockfd_udp);	
    //连接_tcp  
    int connfd_tcp;
    connfd_tcp= accept(sockfd_tcp, (struct sockaddr*)&client_addr_tcp, &client_addr_tcp_len);         
    if(connfd_tcp< 0){  
    	perror("accept");   
     }		
     //接收_tcp
    char recv_buf_tcp[MAXSIZE] = "";
    recvfrom(connfd_tcp, recv_buf_tcp, sizeof(recv_buf_tcp), 0, (struct sockaddr*)&client_addr_tcp, &client_addr_tcp_len);  
    printf("receive tcp data:%s\n",recv_buf_tcp);
    //关闭连接_tcp	
    close(connfd_tcp); 
    //关闭_tcp
    close(sockfd_tcp);
    return 0;      
}  



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值