服务端写了两个套接字,分别接收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;
}