COS461是普林斯顿大学的计算机网络课程:https://github.com/PrincetonUniversity/COS461-Public
assignment1
这次作业的任务大概分为两大部分:搭建环境和socket编程。
搭建环境
按照教程一步一步搭建即可,期间可能会有各种问题,这时候Google或者百度解决即可。
socket编程
编程部分分为两部分,c语言版本和python或者go版本的server和client,我这里使用go语言。
建议先仔细看编程要求:
- server端需要死循环等待client端连接
- server端需要把从客户端传来的数据输出到标准输出,之后不需要做任何其他事情
- server端注意不要使用fork!!!
- client端需要读取标准输入,直到读到EOF
- client端只需要发送一次消息即可,发送完即可退出,不需要死循环!!!
C语言部分
-
课程里给了一个教程地址:https://beej.us/guide/bgnet/html/
-
可以看这个教程快速熟悉Linux系统编程和socket编程的知识,如果想系统学习,建议去看《Unix网络编程》,入门必备。
-
其实大概框架可以参考上面的教程的例子写出来,比较麻烦的部分是输入输出部分
贴一下核心代码:
server-c.c
:
while (1)
{
// main accept() loop
sin_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == -1)
{
perror("accept");
continue;
}
char buf[RECV_BUFFER_SIZE];
n = recv(new_fd, buf, RECV_BUFFER_SIZE, 0);
while (n > 0)
{
fwrite(buf, n, 1, stdout);
fflush(stdout);
n = recv(new_fd, buf, RECV_BUFFER_SIZE, 0);
}
close(new_fd);
}
client-c.c
:
numbytes = fread(buf, 1, SEND_BUFFER_SIZE, stdin);
while (numbytes > 0)
{
if (send(sockfd, buf, numbytes, 0) == -1)
{
fprintf(stderr, "client: failed to send\n");