我刚刚开始使用c进行网络编程。我按照一个简单的教程创建了一个接受连接的服务器,并打印出客户端发送的消息。
客户端将参数作为服务器的地址。
我不确定如何指定服务器的地址?这是我的机器名吗?
我在一个终端中运行服务器并尝试从另一个终端连接。感谢您的帮助:))
这是服务器代码
`#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
#define BUFLEN 1500
int fd;
ssize_t i;
ssize_t rcount;
char buf[BUFLEN];
printf("test1");
fd = socket (AF_INET,SOCK_STREAM,0);
if (fd == -1){
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
struct sockaddr_in addr;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(500);
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
printf("cannot bind socket");
}
if (listen(fd, 20) == -1) {
printf("unable to listen");
}
int connfd;
struct sockaddr_in cliaddr;
socklen_t cliaddrlen = sizeof(cliaddr);
connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen);
if (connfd == -1) {
printf("unable to accept");
}
rcount = read(fd, buf, BUFLEN);
if (rcount == -1) {
// Error has occurred
}
for (i = 0; i < rcount; i++) {
printf("%c", buf[i]);
}
}`
答案 0 :(得分:1)
printf("test1");
您应该在打印字符串的末尾添加“\ n”(换行符字符),以便立即打印。如果没有“\ n”,printf()会缓冲其输出,但您看不到它们。
addr.sin_port = htons(500);
端口0 - 1023被称为“众所周知的端口”并保留给系统(根)。对于像这样的测试程序,您应该使用1024或更高的端口。将其从500更改为1500(例如)成功绑定。 (您没有看到错误消息“无法绑定套接字”,因为它没有“\ n”,如上所述。)
rcount = read(fd, buf, BUFLEN);
你应该从connfd而不是fd读取。有了这些变化,它对我有用。 (我使用“telnet localhost 1500”作为客户端。)