linux socket通信做的聊天程序有关问题

linux socket通信做的聊天程序问题这是我用linux下socket编程做的服务器程序:#include pthread.h#includ

linux socket通信做的聊天程序问题
这是我用linux下socket编程做的服务器程序:
#include <pthread.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <netdb.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h> 
#include <string.h>   

#define BACKLOG 1
void* fwq_fun()
{
int socket_ret;
int bind_ret;
int listen_ret;
int accept_ret;
int cho = 1;

struct sockaddr_in pin;
struct sockaddr_in accept_info;
unsigned int port = 6666;

memset(&pin,0,sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_port = htons(port);
pin.sin_addr.s_addr = htonl(INADDR_ANY);

socket_ret = socket(AF_INET, SOCK_STREAM, 0);
if (socket_ret < 0)
{
printf("socket:fail\n");
return NULL ;
}
setsockopt(socket_ret, SOL_SOCKET, SO_REUSEADDR, &cho, sizeof(cho));
bind_ret = bind(socket_ret, (struct sockaddr*)&pin, sizeof(pin));
if (bind_ret < 0)
{
printf("bind_ret:fail  %d\n", errno);
return NULL ;
}

listen_ret = listen(socket_ret, BACKLOG);
if (listen_ret < 0)
{
printf("listen_ret:fail %d\n", errno);
return NULL ;
}

while (1)
{
char buf[30] = {0};
accept_ret = accept(socket_ret, (struct sockaddr *)&accept_info, (socklen_t *)sizeof(accept_info));
if (accept_ret < 0)
{
printf("accept_ret:fail %d\n", errno);
return NULL ;
}

fgets(buf, sizeof(buf), stdin);

send(accept_ret, buf, sizeof(buf), 0);

}

close(socket_ret);
close(accept_ret);

return NULL;

}

int main()
{
pthread_t fwq_thread;
int ret = pthread_create(&fwq_thread, NULL, fwq_fun, NULL);
if (ret != 0)
{
perror("bao_fun:fail\n");
return -1;
}

pthread_join(fwq_thread, NULL);
return  0;
}






这是客户端程序:



#include<pthread.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>

#define BACKLOG 1
void* khd_fun()
{
int socket_ret;
int connect_ret;
int recv_ret;
char buf[30] = {0};

struct sockaddr_in pin;
unsigned int port = 6666;

memset(&pin,0,sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_port = htons(port);
pin.sin_addr.s_addr = htonl(INADDR_ANY);

socket_ret = socket(AF_INET, SOCK_STREAM, 0);
if (socket_ret < 0)
{
printf("socket:fail\n");
return NULL ;
}

connect_ret = connect(socket_ret, (struct sockaddr * )&pin, sizeof(pin));
if (connect_ret < 0)
{
printf("connect_ret:fail %d\n", errno);
return NULL ;
}

while (1)
{
recv_ret = recv(socket_ret, buf, sizeof(buf), 0);

if (strlen(buf))
printf("message received :%s\n", buf);
}
return NULL;

}

int main()
{
pthread_t khd_thread;
int ret = pthread_create(&khd_thread, NULL, khd_fun, NULL);
if (ret != 0)
{
perror("bao_fun:fail\n");
return -1;
}

pthread_join(khd_thread, NULL);
return  0;
}

问题一:先运行客户端报错:connect函数失败,errno意思是:Connection refused

问题二:先运行服务器端再运行客户端,服务器端报错:accept函数失败,errno意思是:Bad address

求大神指点一二
[解决办法]
问题一:先运行客户端报错:connect函数失败,errno意思是:Connection refused
应该的

问题二:先运行服务器端再运行客户端,服务器端报错:accept函数失败,errno意思是:Bad address
设置下accept_info
[解决办法]

//accept_ret = accept(socket_ret, (struct sockaddr *)&accept_info, (socklen_t *)sizeof(accept_info));
socklen_t SockLen = sizeof(accept_info);


accept_ret = accept(socket_ret, (struct sockaddr *)&accept_info, &SockLen);//accpet改成这样吧


[解决办法]
google 个程序看看
[解决办法]
引用:
//accept_ret = accept(socket_ret, (struct sockaddr *)&accept_info, (socklen_t *)sizeof(accept_info));
socklen_t SockLen = sizeof(accept_info);
accept_ret = accept(socket_ret, (struct sockaddr *)&accept_info, &SockLen);//accpet改成这样吧


改成这个试试,应该是这个原因, 这个长度是要传地址的, 而且而且在外面地址一个变量,不要强转,因为需要一个地址来保存这个值
[解决办法]
我有源码,加我qq我给你