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 。
- Linux下的socket建立
- Linux下Loadrunner建立socket连接方法
- Linux下的C语言Socket函数建立TCP连接(代码+注释)
- Linux下进程的建立
- linux下的项目建立
- Linux下的Socket编程
- linux下的socket编程
- Linux下的Socket编程
- linux下的socket编程
- Linux下简单的socket
- Linux下的socket编程
- linux下的socket编程
- linux下的socket编程
- LINUX下的SOCKET编程
- Linux下的Socket编程
- Linux下的socket文件传输
- Linux下的socket编程
- linux下的socket模型
- mysql: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/sha
- 安卓配置文件SharedPreferences
- Android应用程序之桌面快捷方式
- TypeError: this constructor takes no arguments
- LeetCode - Best Time to Buy and Sell Stock II
- Linux下的socket建立
- 我好想出去玩啊 只是……
- android开发文件转载
- sharepoint 2010 使用水晶报表的完全方案。
- java线程的join,wait,notify深入理解
- android.transition
- 蓝桥杯初赛试题4
- three.js学习点滴(2)— 模型导入
- Android各国语言编码