- 论坛徽章:
- 0
|
我升级到2.6的内核了,运行如下代码时还是有问题,bind 出错。
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 256
void str_echo(int sockfd)
{
ssize_t n;
char buf[MAXLINE];
again:
while ((n = read(sockfd, buf, MAXLINE)) > 0)
write(sockfd, buf, n);
if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
{
printf("str_echo:read error\n");
exit(0);
}
}
int main(int argc, char *argv[])
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(2008);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
if (listenfd == -1)
{
printf("socket error\n");
exit(0);
}
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
printf("bind error\n");
exit(0);
}
if (listen(listenfd, 5) == -1)
{
printf("listen error\n");
exit(0);
}
for ( ; ; )
{
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
if (connfd == -1)
{
printf("accept error\n");
exit(0);
}
childpid = fork();
if (childpid == -1)
{
printf("fork error\n");
exit(0);
}
if (childpid == 0)
{
close(listenfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
} |
|