资源描述
成都信息工程学院考试试卷
学年第学期
课程名称:
网络编程技术
使用班级:网络工程学院级
试卷形式:开卷口闭卷曰填空题(每空2分,共22分)
试
题
*
四
五
六
七
八
九
十
总 分
得
分
1.在基于TCP的通信中,主动关闭连接的一方会在TIME.WAIT状态下等待
长度的时间。因此,主动关闭一方的程序无法马上重新启动并再次绑定相同的IP地址与端口。这时可以使用函数
端口。这时可以使用函数
并在参数中指字套接字选项
2.名字到IP地址的解析使用的函数是
2.名字到IP地址的解析使用的函数是
,IP地址到域名的解析
使用的函数是
3. 为保证“大端”和“小端”字节序的机器之间能相互通信,需在发送多字节整数时,
将主机字节序转换成
4. socket()函数可以创立三类套接字,分别是TCP套接字,
5. bind。、connect()等函数在出错的时候均会返回-1,具体出错的原因的错误代码可以在
全局变量中找到,调用
可以将错误代码转换为它对应的字符串信息。
6.
在TCP连接中,假设需要关闭某个方向的连接,可以使用函数7.
gethostname(char *name, size_t namelen)函数的功能是8.
pselect (int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const structtimeval *timeout, const sigset_t *sigmask)函数的 maxfd 参数的值
,timeout参数定义的超时时间精确到,sigmask
sleep(l);printf(nchild running.\nn);
printf(nchild dead.\nn); exit(O);
}
else if ( pid > 0)
{printf(nparent running AnH); waitpid(pid, NULL,。); printf(Hparent exit\nn);
} else (printf(nfork error.'/); exit(O);
}
(1) fork()函数的功能:
(2) waitpid(pid, NULL, 0)函数的功能:
(3) 该程序运行成功后,其结果为:
5. 阅读以下程序,根据注释补全代码,并写出运行结果。
#include <stdio.h>#include <pthread.h>
pthread_key_t key;void echomsg(int t)
printf(ndestructor excuted in thread %d9param=%d\nn,pthread_self(),t);void * childfun(void *arg)
int tid=pthread_self();printf(nthread %d enter\nH,tid);
printf(nthe key,s%d\n,\pthread_getspecific(key));pthread_setspecific(key,(void *)tid);
sleep(2);printf(nthread %d key's %d\nn,tid,pthread_getspecific(key));
sleep(5);int main(void)
pthread_t child_tid;printf(nthe main tid is %d\n”,pthread_self());
pthread_key_create(&key,(void *)echomsg);〃创立子线程,线程执行
函数为childfun、线程id保存到child_tid变量,pthreadJoin(child_tid,NULL);
pthread_key_delete(key);printf(nmain thread exit\nn);
return 0;}
假如程序运行后,主线程id为123456,子线程id为234567,请写出程序的运行结果如下:
6. 以下程序实现了简单得标准输入的I/O复用,请补全代码。
#include <stdio.h> #include <sys/time.h>#include <sys/types.h>
#include <unistd.h>int main(void)
(fd_set rfds;
struct timeval tv;int retval;
char temp[100];(1)
(2)7.
7.
tv.tv_sec = 5;
tv.tv_usec = 0;
if(.
else
(4))
fgets(temp, 100,stdin); printf(nData is available now.\nn);
printf(nNo data arrive.\nn);
exit(0);
阅读以下程序,根据注释补全代码,并写出运行结果。
#include <pthread.h>#include <stdlib.h> #include <unistd.h> void *thread_function(void *arg)
inti;for (i=0; i<2; i++)
printf(nThread says hi!\nn); sleep(l);}
return NULL;}
int main(void)
)〃创立子线程,线程id保存在childthread中,
〃线程函数为 thread_function
pthread_t childthread; printf(Hmain thread enter.\nn); if(printf(Herror creating thread.");
exit(l);
}
if ()//等待子线程childthread结束,获得和释放子线〃程的状态信息。
{printf(nerror joining thread.n);
exit(l);}
printf(Hmain thread exit.'rT);exit(O);
假如程序正常运行,请写出结果:
8. 给出下面函数的作用:
int flags;(1 )flags=fcntl(fileno(stdin), F_GETFL,0);
(2)flags |= O.NONBLOCK;(3)fcntl(fileno(stdin), F_SETFL, flags)
9. 以下是UDP服务器端局部代码,阅读程序,根据注释完成空缺局部代码。
Int sockfd;struct sockaddr_in server, client;
int sin_size, num;char msg[MAXDATASIZE];
〃省略局部的代码完成的功能是:套接字创立和绑定。
while(l) ( 〃接收客户端数据,保存在msg缓冲区中
(1) 〃打印客户端的端口号}
(1)(2)
10. 以下是TCP服务器端局部代码,阅读程序,根据注释完成空缺局部代码。 struct sockaddr_in servaddr, cliaddr;
socklen_tlen;
int sockfdl, sockfd2;
〃省略局部的代码完成的功能是:套接字创立、绑定和监听。
(1)〃获得客户端连接请求
if (connfd == -1)(
/*出错处理*/
}(2)〃打印已连接客户端IP
地址
(1)
(2)阅读程序,根据注释完成空缺局部代码。
#include <sys/socket.h>#include <stdio.h>
int main(void)(int sockfd ;
. 〃省略局部为创立套接字代码,创立的套接字保存在sockfd变量中。 int opt = 1; 〃重用本地地址
(1) _〃获得套接字接收缓冲〃
区大小,保存到。pt变量中 〃打印输出缓冲区大小
fflush(stdout);close(listenfd);}
(1)
(2)
(3)原始套接字,阅读程序,根据注释完成空缺局部代码。 . ......〃省略局部的代码为程序需要的有关头文件
int main(int argc,char **argv){
int sockfd;int on;
on=l;一(1)〃构造ipv4, UDP的原始套接字,
保〃存在sockfd变量中。
_ (2)〃设置套接字[P_HDRTNCL选项,由
〃用户填写网络层协议头部,close(sockfd);
return 0;}
(1)
(2)本程序为UDP客户端程序,地址相关信息从命令行输入,根据提示回答相关的问题。
.......〃省略局部的代码为程序需要的有关头文件#define PORT1234
int main(int argc, char *argv[])int fd, numbytes;
char buf[MAXDATASIZE];struct hostent *he;
struct sockaddr_in server, reply;if (argc != 3)
{printf(nUsage: %s <IP address> <Message>\n!\ argvfO]);
exit(l);}
if ((he = gethostbyname(argv [ 1 ])) == NULL) (perror(Hgethostbyname error\nn);
exit(l);}
. .....〃本局部省略了创立UDP套接字的代码,创立的套接字保存在fd变量中 bzero(&server, sizeof(server));server.sin_family =;
server. sin_port =iserver.sin_addr 二;
// 一条程序语句,完成客户端向服务器发送数据。
close(fd);return 0;
}
(1)完成程序空缺局部的内容(2)简述gethostbyname函数的功能,并指出其参数为点分十进制字符串时,其如何操 作。
!14.
!・..・・・.〃省略局部的代码为程序需要的有关头文件I
i int main(void)I
i{I
;pid_t result;;if(result == -1)
ii
-{i
• perror("fork”);i
i; exit;
! }
! else if(result == 0)
{
sleep(3);
printf(“child\n”);
exit(O);
)
else
图
(
;wait(result);i
iiprintf("parent\n”);
:exit;i
i:)
ii
:}!(1)假如程序不出错执行,请写出程序的执行结果
(2)简述基于TCP的多进程并发服务器服,服务器程序的编程流程;参数的作用是o pselect函数返回值有三种情况,返回值为0
表示,返回值大于0表示,而返回值为-1时表示出错。
9. 设置SO_KEEPALIVE选项作用是。
10. pthread_key_create(pthread_key_t *key, void (* destructor)(void * value))函数的作用是,其中 destructor 是, value
是, value 的默认值是°基于TCP协议的服务器端程序中,需要两个描述符,它们分别是由函数
创立的负责的描述符,和由函数创立的负责的描述符。
11. 基于TCP协议的套接字服务器程序中,会产生两个描述,其中之一是由函数创立的描述符,其主要功能是:其中之二是由
函数创立的描述符,其主要功能是:
12. 函数bind返回的一个常见错误是:所绑定的地址已被其它进程使用,为解决这个问题,我们可以通过调用 函数,并为该函数的Optname (需设置
的选项)形参传递参数防止产生这个错误。
13. 基TCP套接字程序中,服务器可以通过函数返回与之通信的当前客户端的套接字地址结构。
14. pthread_detach(pthread_t tid)的作用是将一个线程变成线程。
15. 基于TCP协议的套接字服务器程序中,会产生两个描述,其中之一是由函数创立的描述符,其主要功能是:其中之二
是由函数创立的描述符,其主要功能是:
16. 在Liunx操作系统中支持五种I/O模型,分别是、、、阻塞I/O模型和非阻塞I/O模型。
17. 函数在进程内局部配一个标志TSD的关键字,并且该函数其中一个形参是可选的析构函数,当系统调用该析构函数时,传递的参数是
15.阅读程序,假如程序运行时,主线程的线程id号是12345678,子线程child_tidl的 线程id号为987654321;子线程child_tid2的线程id号为87654321,完成下面的问题。 #include <stdio.h>#include<pthread.h>
pthread_key_t key;pthread_once_t once = PTHREAD_ONCE_INIT;
static void printfun(void){
printfC'enter printf function ;\rT);}
void echomsg(int t){
printfC'destructor excuted in thread%d,param=%d\n,\pthread_self(),t);}
void *childfunl(void *arg)(
pthread _once(&once,printfun);}
void *childfun2(void *arg){
pthread _once(&once,printfun);
int tid = pthread_self();
printfC'thread %denter\n,\tid);
printf(uthe key ,s%d\n,\pthread_getspecific(key));
pthread_setspecific(key,(void *)tid);
sleep(2);printf(uthread2%d key's %d\n,\tid,pthread_getspecific(key));
sleep(5);i
i! I
ii
! Int main(void)i
i! {
i! pthread_t child_tid 1 ,child_tid2;
; printfC'the main tid is %d\n",pthread_self());:①;〃仓U建TSD关键字,key指向创立的关键字,//echomsg为
i 析构函数。
I;pthread_create(&child_tid 1,NULL,childfun 1,NULL);
•pthreadj oin(child_tid 1,NULL);果 «pthread_create(&child_tid2,NULL,childfun2,NULL);
\sleep(lO);!pthreadJoin(child_tid2,NULL);
瞻pthread_key_delete(key);
义江 return 0;N K }
救&
霸 (1)根据程序上下文及注释,完本钱程序中①空缺处的代码。
*!(2)请写出程序的运行结果S !
II
N :
隅 ;I
II
I:(3)解释 pthread_create(&child_tidl,NULL,childfun 1,NULL);完成的功能并解释个参数的
:含义;・..・・・.〃省略局部的代码为程序需要的有关头文件
int main(void)(
char buf[20];
int num, flags;
flags = fcntl(0,F_GETFL,0);
①〃加入非阻塞标志.
if(fcntl(O,F_SETFL,flags)==-1)
(
perror("fcntl”);
exit(l);
}
while(l)
(num = read(0,buf,20);
if(errno == EWOULDBLOCK){
perror("read:");write( 1, “tryagain'n” ,strlen( "tryagain'n” ));
}write(l,buf,num);
)
return 0;}
(1) 解释程序中flags二fcntl(0,F_GETFL,0);语句完成的功能;
(2) 根据程序上下文,完成程序中①空缺处的代码。
(3)解释程序中fcntl(O,F_SETFL,flags)语句完成的功能。
(3) 请判别该I/O模型是同步I/O模型还是异步I/O模型。
17.解释下面各个语句完成的功能;signal(SIGIO,ioaction);
(1) fcntl(sockfd,F_SETOWN,getpid());ioctl(sockfd,FIOASYNC,&on); 〃 on 为整形,且 on=l
18. 谈话程序。双方都可以从终端输入一串字符(以回车结束),通过UDP的 方式发送到对方,并显示在对方的终端上。从命令行输入目的地址、目的 端口、源地址、源端口。使用I/O复用,进程阻塞到select,当标准输入 和socket有数据时返回。根据以下程序例如完成程序填空。
fd_set infds;For (;;) {
/*重置句柄集*/ /*把标准输入置入句柄集*/ /*把 socket 置入句柄集*/ maxfd=max(fileno(stdin), sockfd)+1;if (select (maxfd, &infds, NULL, NULL, NULL)=T)
{ /*错误处理*/}if (FD_ISSET (sockfd, &infds)) /*测试 socket 是否可读*/
(/* 读 socket */}if (FD_ISSET(fileno (stdin), &infds)) /*测试标准输入是否可读*/
( /*读标准输入*/)
}非阻塞I/O的实现,可以通过fcntl()来改变句柄(或描述符)的标志来实现。 将句柄(描述符)sockfd设置为非阻塞的代码是。
int flags:
/*读取句柄当前标志*/ /*加入非阻塞标志*/
/*设置带有非阻塞标志的新标志*/gethostname函数,该函数返回当前主机的名字,根据下面的程序进行填 空。
#include <unistd.h>int main()
(char buf [ 100];
size* namelen;namelen=sizeof(buf);
/* 调用 gethostname 函数*/printf(nhostname is %s\nn,);/* 输出主机的名字 */
}
19. 信号驱动I/O的实现,要通过信号驱动方式对多个句柄进行复用,要通过 如下几个步骤:将这些句柄(描述符)的属主都设为一个进程。将这些句柄
(描述符)的标志位O_ASYNC翻开,让句柄(描述符)发生I/O事件时发 送SIGIO信号。在属主进程中设置对SIGIO信号的处理。当有I/O事件在任 何一个句柄(描述符)上发生时,系统都会向进程发送SIGIO信号。进程在 对SIGIO的中断处理中再查询各个句柄(描述符)状态,进行相应的处理。 根据以上描述完成下面的程序填空。
void ioaction(int signo) /*定义信号处理程序*/{•••.}
int main()(
stdinfd二句 eno(stdin);
/*指定信号处理程序*/ /*句柄(描述符)所有者为当前进程*/ int on=l;
ioctl(sockfd,FIOASYNC,&on); /*sockfd 发生 I/O 事件时发送 SIGIO 信号*/n=read(stdinfd,msg,BUFLEN);/* 可能阻塞 */ )
20. int main(void)
{pid_t pid;
int status;if ((pid = fork()) == 0)(
sleep(2);
printf(nchild running.\nn); printf("child sleepingAn"); sleep(5);
printf("child DeadAn"); exit(O);}else if ( pid > 0)
(
printf(nparent running ・\n"); printf(nparent exit\nn); exit(O);} else (
printf("fork error.\n"); exit(l);}
}运行结果如下:
23.
#include <sys/types.h>#include <unistd.h>
int main(void)(
pid_t pid;int status;
if ((pid 二 vfork())二二 0)(
sleep(2);
printf("child runningAn"); printf("child sleepingAn"); sleep(5);
printf("child deadAn"); exit(O);}else if ( pid > 0)
(printf("parent running An");
printf(" parent exit\n"); exit(O);} else (
printf("fork error.\n"); exit(O);}
}运行结果如下:
24. #include <pthread.h>#include <stdio.h>
pthread_once_t once=PTHREAD_ONCE_INIT; void once_run(void){
printf(nonce_run in thread %d\nn,pthread_self());}
void * child 1 (void *arg)(
int tid=pthread_self(); printf(nthread %d enter\nn,tid); pthread_once(&once,once_run); printf(nthread %d retums\nn,tid);}
void * child2(void *arg)(
int tid=pthread_self(); printf(nthread %d enter\nn,tid); pthread_once(&once,once_run); printf(nthread %d returns'll",tid);}
int main(void)(
int tidl,tid2;printf("hello\n");
pthread_create(&tidl,NULL,childl,NULL); pthread_create(&tid2,NULL,child2,NULL); sleep(lO);printf(nmain thread exit\nn); return 0;
)运行结果如下,线程的ID随便用一个整数来代替。
25.
#include <pthread.h>#include <stdlib.h>
#include <unistd.h>#include <stdio.h>
int my global;
pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER; void *thread_function(void *arg){
int i,j;for (i=0; i<6; i++)
(pthread_mutex_lock(&my mutex);
j=my global;j=j+l;
printfC'.”);
fflush(stdout);
sleep(l);
myglobal=j; pthread_mutex_unlock(&mymutex);)
return NULL;}
int main(void)(
pthread_t mythread;int i;
if ( pthread_create( &mythread, NULL, thread_function, NULL)) (printf(nerror creating thread/1);
19.以INADDR_ANY调用bind的服务器,在接收到连接后,调用数获取系统选择的IP地址。
20.如果用户程序为发送网络数据报构造自己的IPv4头部,需创立接字,并且前提条件是:调用
接字,并且前提条件是:调用
函数,给套接字设置
二、判断题(正确错误X)(每题1分,共14分)
的2.
K
& 3.
图4-
1
:5.
的2.
K
& 3.
图4-
1
:5.
运行。()
在TCP网络程序中,connect()函数用于客户端向服务器发起连接。而在UDP网络程
序中,由于UDP是面向无连接的,所以connect()函数不能用于UDP客户端。()
inet_ntoa()函数可以将32位的网络字节序二进制IPv4地址转换成相应的字符串形式
的IP地址,但不能将二进制IPv6地址转换成相应的字符串形式的IP地址。()
服务器程序通常都会调用bind。函数以绑定监听地址,而客户端那么很少调用它。()
当一个客户SYN到达时,假设未完成连接队列和巳完成连接队列都是满的,TCP就忽
略此分节,且不发送RSTo ()
6.
调用close()函数将立即关闭发送与接收这两个方向的TCP连接而不管将关闭的套接
字的引用情况。()
7.
在TCP客户服务器通信中,假设服务器端崩溃,那么可以通过重启服务器让正在进行的
通信继续。()
8.
TCP迭代服务器在某一时刻最多只能存在一个客户端与之建立的通信连接,而并发
服务器在某一时刻可以存在多个客户端与之建立的通信连接。
9.
互斥锁是一种专用于进程间数据同步的技术。
题号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
答案
在用pthread库编写的多线程程序中,假设主线程退出,那么主线程创立的新线程将继续1.
10.当子进程正常或异常终止时,系统内核会向其父进程发送SIGCHLD信号。()
abort();for (i=0; i<6; i++)
{
pthread_mutex_lock(&mymutex); myglobal=myglobal+1; pthread_mutex_unlock(&my mutex); printf("F");
fflush(stdout);
sleep(l);}
if ( pthreadjoin ( mythread, NULL)){
printf(nerror joining thread/); abort();}
printf(n\nmyglobal equals %d\nn,myglobal); exit(O);
}
运行结果如下:
26.
main(int argc, const char **argv)
(ulong_t addr;
struct hostent *hp;char **p;
if (argc != 2) (printf(nusage: %s IP-address\nn, argv[0]); exit (1);
}if (((addr = inet_addr(argv[l ])) == -1) ( printf(nIP-address must be of the form a.b.c.d\n"); exit (1);}
hp = gethostbyaddr((char *)&addr, sizeof (addr), AF_INET); if (hp = NULL) (;printf(nhost information for %s not found'n", argv[l]);
:exit (1);; }
:for (p = hp->h_addr_list; *p != 0; p++) (!struct in addr in;
I 7;char **q;
;memcpy(&in.s_addr, *p, sizeof (in.s_addr));:printf(n%s\t%s,\ inet_ntoa(in), hp->h_name);
:for (q = hp->h_aliases; *q != 0; q++):printf(" %s", *q);}
驴 j i exit(0);泌:}
: 执行命令后运行结果如下:
救R
图I
IS i四、问答题(每题7分,共28分)
! i.请说明给新线程传递参数的方法有哪些?这些方法的优缺点是什么?
I请分别说明以下线程专用数据(TSD, thread specific data)相关的函 数的作用是什么?
int pthread_key_create(pthread_key_t *key, void (* destructor) (void *value));int pthreadsetspecific(pthread_key_t key, const void *value); void * pthread_getspecific(pthread key_t key);
int pthread_key_delete(pthread_key_t key);请比拟信号驱动I/O模式与非阻塞I/O模式,并说明如何在程序中将套接 口设置为非阻塞I/O模式。
2. 请写出使用select ()函数实现I/O多路复用的步骤。
3. 请简述基于TCP和UDP协议的网络通信程序调用bind ()和connect () 函数的作用分别是什么?
4. 请简述网络编程中设计并发服务器,使用多进程与多线程请问有什么区 另U?
5. 如何创立一个线程?请写一段程序说明(要求对相关函数和参数做出说 明)。
6. 请简述在Linux系统中阻塞I/O和非阻塞I/O两种模型的异同点。
7. 请简述用TCP套接字建立服务器和客户端的基本步骤,并写出每步调用的 函数。
8. UDP套接字程序中调用connect ()函数和不调用该函数的区别是什么?
9. 请创立一个访问ICMP的原始套接字,并简述原始套件字可以提供的TCP/UDP套接字一般不提供的功能(至少3种);
10. 请简述用TCP套接字建立多进程并发服务器的基本步骤,并写出每步调用 的函数。
11. 请给出设置套接字SCLRCVBUF选项的作用,并说明该选项是针对哪一层协 议进行设置,并具体说明在服务器和客户端设置该选项时,至少在调用什 么函数之前进行设置及理由。
12. 非阻塞I/O是Linux下可用的I/O模型之一,请以recvfrom函数为例说 明该模型下系统I/O的工作模式。
13. 请简述accept ()函数调用成功后,返回的值。
14. 请创立一个访问ICMP的原始套接字,并简述原始套件字可以提供的TCP/UDP套接字一般不提供的功能(至少3种);
15. 请简述用TCP套接字建立多线程并发服务器的基本步骤,并写出每步调用 的函数。
16. 简述select ()和pselect ()函数的区别。
17. 基于TCP协议的套接字服务器程序中,会产生两种套接字描述符,简述这 两种套接字描述符分别是什么?分别由什么函数创立?以及这两种描述符 各自的作用。
18. 设置套接字选项时,请指出SO_RCVBUF选项所在的层(网络协议中的那一 层)?并具体说明在服务器和客户端设置该选项时,必须在调用哪一网络 编程函数之前进行设置及理由。
19. 简述基于TCP的多线程并发服务器服,服务器程序的编程流程;简述5种10模型分别是哪五种10模型。
20. 请简述fork和vfork的区别和联系。
I 24.在多进程程序设计时,产生新的子进程后,父进程要关闭连接套接字,而 子进程要关闭监听套接字,具体原因是什么?
救&
图 25.请简述套接字SO_REUSEADDR选项的作用I
黑!
S !
II
五、程序题(18分)计一个基于TCP的服务器端程序,端口号为8596,使用服务器的任务一个IP地址。只 为IP地址为的客户端提供服务,其它IP地址的客户端连接以后就直接断开。程序代码的头文件局部可以省略。
服务器的功能是:(1)循环接收指定IP地址的客户端的连接,连接成功后打印客户端的 端口号。(2)接收客户端的数据,并打印出来。(3)将收到的客户端数据前面加上"message received: 然后发回给客户端。
六、程序题(16分)
请编写一个基于TCP协议的客户端程序,该程序完成的功能包括:
接收用户从终端输入的字符串,然后发送给服务器。
接收服务器端发回的字符串,并打印出来。
服务器的端口是1234,服务器的IP地址需用户运行客户端程序时手动输入。
1、
2、
3、
客户端程序:
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 1234
int main(int argc, char *argv[]) (int fd;
struct hostent *he;struct sockaddr_in server;
〃从这里开始补全程序七、程序题(20分)
请编写一个基于TCP协议的客户端程序,服务器的端口是1234,服务器的IP地址 需用户运行客户端程序时手动输入,该程序完成的功能包括:
1、 输出系统选择的I P地址和端口号。 接收服务器端发回的字符串,并打印出来。
八、程序题(22分)
请编写一个基于TCP协议的服务器端程序,服务器的端口是1234,服务器的IP地 址选择通配地址,该程序完成的功能包括:
4、输出系统选择的IP地址。
5、接收客户端发回的字符串,并打印出来。
九、编程题(共20分)
编写基于TCP的客户端程序,要求如下:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
客户端可以从终端输入一串字符,以回车结束,然后将输入的字符串发送到 服务器;
客户端可以接收服务器发过来的数据,并在终端上显示; 客户端输入quit时,客户端程序退出;
客户端程序基于select函数实现的IO复用。
服务器的IP地址为:;端口号为:1234;
客户端地址族为IPV4;
局部代码已给出,请继续完成后面的代码。
. .〃省略局部的代码为程序需要的有关头文件
#define MAXDATASIZE 100
int main()
int sockfd,num,m
展开阅读全文