想问一个 关于linux下 socket编程的问题! 请进

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define WAITBUF 10
int main(int argc, char *argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char hello[]="Hello! Socket communication world!\n";

if(argc!=2)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
/*端口号不对,退出*/
if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}

/*服务器端开始建立socket描述符*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}

/*服务器端填充 sockaddr结构*/
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
/*自动填充主机IP*/
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);

/*捆绑sockfd描述符*/
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}

/*监听sockfd描述符*/
if(listen(sockfd, WAITBUF)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}

while(1)
{
/*服务器阻塞,直到客户程序建立连接*/
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
/*可以在这里加上自己的处理函数*/
fprintf(stderr,"Server get connection from %s\n",
inet_ntoa(client_addr.sin_addr));
if(send(new_fd,hello,strlen(hello),0)==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
/*这个通信已经结束*/
close(new_fd);
/*循环下一个*/
}
close(sockfd);
exit(0);
}

这段编程我编译总是出错!
1、 accept函数中,第三个参数原型是 socklen_t的,这是个什么啊? 编译的时候总是 说 它和int 的转换无效! 应该怎么修改?

2、编译的时候 命令行输入的是:
./TCPServer (服务器IP) (端口号)
我想问的是,这个 服务器IP和 端口号 在程序里面是怎么体现出来的?
是不是 那个 if(argc!=2) 决定的啊? 也就是命令行必须 输出2个字符串。
如果输出 三个字符串(包括端口号) 能行么? 哪位高手帮帮我啊!
3、求学不容易啊!
请高手 自己编译一下! 修改这三个问题! 另外、
4、 最后的 close()函数 作用范围不明!

请大家给出个切实可行的办法! 主要就是 疑问 1 和 4

1、 accept函数中,第三个参数原型是 socklen_t的,这是个什么啊? 编译的时候总是 说 它和int 的转换无效! 应该怎么修改?

a.accept的函数原型为int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);最后一个参数是socklen_t类型,没记错的话,他是unsigned int类型。所以会有gcc会warning(g++则报错,g++更严格)

2、编译的时候 命令行输入的是:
./TCPServer (服务器IP) (端口号)
我想问的是,这个 服务器IP和 端口号 在程序里面是怎么体现出来的?
是不是 那个 if(argc!=2) 决定的啊? 也就是命令行必须 输出2个字符串。
如果输出 三个字符串(包括端口号) 能行么? 哪位高手帮帮我啊!

a.服务器的IP是写死在程序里的,这句,
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);INADDR_ANY表示让协议栈自己选IP地址(针对多IP的情况);端口体现在这句 server_addr.sin_port=htons(portnumber);程序要求你输入两个字符串,其中第一个为程序名,第二个为端口号。比如你编译出来的程序叫server,则命令为server 8888,就可以执行了。注意这里的argc等于几表示连程序名称在内总共有几个字符串。

4、 最后的 close()函数 作用范围不明!

因为你调用了socket函数打开了一个描述字sockfd,所以这里要把他关闭。
newfd是你accept返回的描述字,前面已经关了,这两个是不一样的。sockfd用来监听,newfd用来与建立连接的对端通讯。

另外,你露了头文件,所以warning
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define WAITBUF 10
#include <unistd.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
socklen_t sin_size;
int portnumber;
char hello[]="Hello! Socket communication world!\n";

if(argc!=2)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
/*端口号不对,退出*/
if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}

/*服务器端开始建立socket描述符*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}

/*服务器端填充 sockaddr结构*/
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
/*自动填充主机IP*/
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);

/*捆绑sockfd描述符*/
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}

/*监听sockfd描述符*/
if(listen(sockfd, WAITBUF)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}

while(1)
{
/*服务器阻塞,直到客户程序建立连接*/
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
/*可以在这里加上自己的处理函数*/
fprintf(stderr,"Server get connection from %s\n",
inet_ntoa(client_addr.sin_addr));
if(send(new_fd,hello,strlen(hello),0)==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
/*这个通信已经结束*/
close(new_fd);
/*循环下一个*/
}
close(sockfd);
exit(0);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-03
一个线程要对应一个单独的fd,而fd2是全局变量,被所有线程公用。
注:每个fd都对应一段缓存,如果thread1读完了这段缓存之后,thread2再去读的话,是什么也读不到的。
第2个回答  2009-08-05
1.把int sin_size改为socklen_t sin_size
改完即可编译通过,这个视不同的编译器而不同。
2.if(argc!=2)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
意思是如果输入的不是两个字符串,就会退出程序。看来此程序只能输两个字符串,第二个字符串必须是端口号。
3.努力!
4. 最后的 close()函数用来关闭建立的socket服务。
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) 此句建立了名为sockfd的socket服务,程序结束时要把它close掉。
第3个回答  2009-08-04
》 accept函数中,第三个参数原型是 socklen_t的,这是个什么啊? 编译的时候总是 说 它和int 的转换无效! 应该怎么修改?
socklen_t 是 结构体类型的

》我想问的是,这个 服务器IP和 端口号 在程序里面是怎么体现出来的?
就是程序参数 argv

是不是 那个 if(argc!=2) 决定的啊? 也就是命令行必须 输出2个字符串
那个只决定了只能有二个参数,ip地址和端口号。
这是输入,看不懂你说的输出是什么意思。
第4个回答  2009-08-04
打开窗口就行了