- 论坛徽章:
- 0
|
代码如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define MAXBUF 1024
int main(int argc, char *argv[])
{
int new_fd,sockfd = -1;
unsigned int port;
socklen_t len;
struct sockaddr_storage sas;
struct sockaddr_in* psin = (struct sockaddr_in*)(&sas);
struct sockaddr_in6* psin6 = (struct sockaddr_in6*)(&sas);
struct addrinfo aiHint;
struct addrinfo *aiList, *aiListCopy;
char buf[MAXBUF + 1];
port = 7838;
memset(&aiHint, 0, sizeof(aiHint));
aiHint.ai_socktype = SOCK_STREAM;
aiHint.ai_protocol = IPPROTO_TCP;
aiHint.ai_family = AF_UNSPEC;
if(!getaddrinfo(argv[1], "7838", &aiHint, &aiList))
{
// aiListCopy = aiList;
// do
for(aiListCopy=aiList; aiListCopy != NULL ;aiListCopy=aiListCopy->ai_next)
{
if(aiListCopy->ai_family == AF_INET)
{
memcpy(&(psin->sin_addr), &(((struct sockaddr_in*)(aiListCopy->ai_addr))->sin_addr), sizeof(psin->sin_addr));
psin->sin_port = htons(port);
psin->sin_family = AF_INET;
// socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
freeaddrinfo(aiListCopy);
exit(1);
} else
printf("socket created\n");
//bind
if (bind( sockfd, (struct sockaddr *)&psin, sizeof(struct sockaddr))){
perror("bind");
freeaddrinfo(aiListCopy);
exit(1);
} else
printf("binded\n");
//listen
if (listen(sockfd, 1024) == -1) {
perror("listen");
freeaddrinfo(aiListCopy);
exit(1);
} else
printf("begin listen\n");
}
else if(aiListCopy->ai_family == AF_INET6)
{
memcpy(&(psin6->sin6_addr), &(((struct sockaddr_in6*)(aiListCopy->ai_addr))->sin6_addr), sizeof(psin6->sin6_addr));
psin6->sin6_port = htons(port);
psin6->sin6_family = AF_INET6;
// socket
if (( sockfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1) {
perror("socket");
freeaddrinfo(aiListCopy);
exit(1);
} else
printf("socket created\n");
//bind
if (bind(sockfd, (struct sockaddr *) &psin6, sizeof(struct sockaddr_in6))){
perror("bind");
freeaddrinfo(aiListCopy);
exit(1);
} else
printf("binded\n");
//listen
if (listen(sockfd, 1024) == -1) {
perror("listen");
freeaddrinfo(aiListCopy);
exit(1);
} else
printf("begin listen\n");
}
}//while(aiList = aiList->ai_next);
freeaddrinfo(aiList);
}
while (1) {
len = sizeof(sas);
if ((new_fd = accept(sockfd, (struct sockaddr *) &sas,&len)) == -1) {
perror("accept");
exit(errno);
}
/* 开始处理每个新连接上的数据收发 */
bzero(buf, MAXBUF + 1);
strcpy(buf, "大家好\n");
/* 发消息给客户端 */
len = send(new_fd, buf, strlen(buf), 0);
if (len < 0) {
printf ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n", buf, errno, strerror(errno));
} else
printf("消息'%s'发送成功,共发送了%d个字节!\n", buf, len);
bzero(buf, MAXBUF + 1);
/* 接收客户端的消息 */
len = recv(new_fd, buf, MAXBUF, 0);
if (len > 0)
printf("接收消息成功:'%s',共%d个字节的数据\n",buf, len);
else
printf ("消息接收失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
/* 处理每个新连接上的数据收发结束 */
}
close(sockfd);
return 0;
}
我想实现兼容IPV4,IPV6的服务器代码,在网上借鉴了不少代码,东改改西改改就有了以上代码,我看着好象没啥不对啊,
我的理解是,运行时,如果是输入的IPV4的IP地址,就创建IPV4的socket,IPV6的也一样,但是无论我运行那种都出现以下错误:
bind:cannot assign requested address.
大家帮我看看,我都快急死了,如果这种实现兼容IPV4,IPV6的服务器代码的方法不对,大家有更好的方法吗?
先谢过大家了. |
|