Linux下的socket建立

来源:互联网 发布:商家怎么投诉淘宝小二 编辑:程序博客网 时间:2024/05/21 11:53

今天调试了一上午的socket通讯,终于连接成功了,代码都是照抄刘同学的。我的客户端程序和服务器程序连接之后,接收数据出现问题,报错:Error: socket receive error!。开始以为是send和recv函数第二、三个参数有问题,原型

ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);

ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);

更改数次之后,仍然有问题,于是又在网上搜了一下别人的代码,终于发现是服务器端的这两个函数的第一个参数有问题。服务器端定义了两个文件描述符,int sock_fd = -1, client_fd = -1;调用accept函数时返回的client_fd 文件描述符连接到调用connect的客服端。传给accept的原始套接字没有关联到这个连接,而是继续保持可用状态并接受其他连接请求。accept函数原型int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);

我的服务器代码如下:

int sock_fd = -1, client_fd = -1;


/** create socket **/
int create_socket(){
int ret = 0;
struct sockaddr_in addr, client_addr;
socklen_t length = sizeof(client_addr);

printf("Info: start create socket!\n");

sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sock_fd){
printf("Error: create socket fail!\n");
return -1;
}else{
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(6666);

/** bind socket 绑定客户端地址 **/
/** listen 宣告可以接受连接请求 **/
/** accept 获取连接请求 **/
if(-1 == bind(sock_fd, &addr, sizeof(addr))){
printf("Error: socket bind failed!\n");
return -1;
}else if( -1 == listen(sock_fd, 5) ){
printf("Error: socket listen failed!\n");
return -1;
}else if( -1 == ( client_fd = accept(sock_fd, &client_addr, &length ))){
printf("Error: socket accept failed!\n");
return -1;
}else{
return 0; //bind 、listen、accept 都成功了
}
}
}


/**测设网络通信**/
void test_socket()
{
char send_data[10] = "111111111";
char recv_data[10] = "000000000";
int send_num = 11;
int recv_num = 0;

if(-1 == send(client_fd, send_data, 10 * sizeof(*send_data), 0) ){
printf("Error: socket sending error!\n");
}
printf("Info: send data: %s\n",send_data);

// rt_task_wait_period_n(WAIT_PERIOD);    //延时

if( -1 == recv(client_fd, recv_data , 10 * sizeof(* recv_data), 0) ){    //接收数据
printf("Error: socket receive error!\n");
}
printf("Info: recv data: %s\n", recv_data);
}


客服端的代码:

int sock_fd = -1;

/** create socket **/
int create_socket(){
int ret = 0;
struct sockaddr_in addr;
printf("Info: start create socket !\n");


sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sock_fd){
printf("Error: create socket fail!\n");
return -1;
}else{
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.17");
addr.sin_port = htons(6666);

/** connect socket **/
if(-1 == connect(sock_fd, &addr, sizeof(addr))){
printf("Error: socket connect failed!\n");
return -1;
}else{
/** connect success **/
return 0;
}
}
}


/**测设网络通信**/
void test_socket()
{
char send_data[10] = "111111111";
char recv_data[10] = "000000000";
int send_num = 0;
int recv_num = 0;


if( -1 == recv(sock_fd, recv_data, 10 * sizeof(*recv_data), 0) ){    //接收数据
printf("Error: socket receive error!\n");
}
printf("Info: recv data: %s\n", recv_data);

// rt_task_wait_period_n(WAIT_PERIOD);    //延时


if(-1 == send(sock_fd, recv_data, 10 * sizeof(* recv_data), 0) ){
printf("Error: socket sending error!\n");
}
printf("Info: send data: %s\n",recv_data);
}


客服端只有一个全局变量的文件描述符,而服务器端有两个全局的文件描述符,在服务器端调用send和recv函数时,使用文件描述符client_fd 。

0 0
原创粉丝点击