我正在尝试使用这些用于TCP-IP服务器和客户端的简单示例C ++代码来学习和理解BSD套接字编程。我已经阅读了标准API,如socket(),bind(),listen(),accept()和read / recv(),甚至还有下面的代码在g ++ / Linux上编译。
我想要做的是看它在现实生活中工作,我的意思是运行服务器代码,然后使用客户端连接到它并从客户端到服务器发送数据,反之亦然,并验证收到的数据。所有这些都在我同一网段的两个linux盒子(Ubuntu)中。我为这两台Linux机器提供了私有IPv4地址。
通过上述网络设置实现此目的,需要设置什么以及下面的服务器和客户端代码中的代码更改?我想真正看到它在网络上实时工作吗?
此外,任何进一步指向代码,博客文章以研究动手插座编程/网络编程都会有所帮助。
//TCP SERVER
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <arpa/inet.h>
//#include <fcntl.h>
#include <unistd.h>
main()
{
char buf[100];
socklen_t len;
int k,sock_desc,temp_sock_desc;
struct sockaddr_in client,server;
memset(&client,0,sizeof(client));
memset(&server,0,sizeof(server));
sock_desc = socket(AF_INET,SOCK_STREAM,0);
server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = 7777;
k = bind(sock_desc,(struct sockaddr*)&server,sizeof(server));
k = listen(sock_desc,20); len = sizeof(client);
temp_sock_desc = accept(sock_desc,(struct sockaddr*)&client,&len);
while(1)
{
k = recv(temp_sock_desc,buf,100,0);
if(strcmp(buf,"exit")==0)
break;
if(k>0)
printf("%s",buf);
} close(sock_desc);
close(temp_sock_desc);
return 0;
}
//TCP CLIENT
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <arpa/inet.h>
//#include <fcntl.h>
#include <unistd.h>
main()
{
char buf[100];
struct sockaddr_in client;
int sock_desc,k;
sock_desc = socket(AF_INET,SOCK_STREAM,0);
memset(&client,0,sizeof(client));
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr("127.0.0.1");
client.sin_port = 7777;
k = connect(sock_desc,(struct sockaddr*)&client,sizeof(client));
while(1)
{
gets(buf);
k = send(sock_desc,buf,100,0);
if(strcmp(buf,"exit")==0)
break;
}
close(sock_desc);
return 0;
}
答案 0 :(得分:4)
为您的代码添加一些错误处理,这可能会引发一些事情,例如:
服务器:
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
//#include <fcntl.h>
#include <unistd.h>
main()
{
int sock_desc = socket(AF_INET, SOCK_STREAM, 0);
if (sock_desc == -1)
{
printf("cannot create socket!\n");
return 0;
}
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(7777);
if (bind(sock_desc, (struct sockaddr*)&server, sizeof(server)) != 0)
{
printf("cannot bind socket!\n");
close(sock_desc);
return 0;
}
if (listen(sock_desc, 20) != 0)
{
printf("cannot listen on socket!\n");
close(sock_desc);
return 0;
}
struct sockaddr_in client;
memset(&client, 0, sizeof(client));
socklen_t len = sizeof(client);
int temp_sock_desc = accept(sock_desc, (struct sockaddr*)&client, &len);
if (temp_sock_desc == -1)
{
printf("cannot accept client!\n");
close(sock_desc);
return 0;
}
char buf[100];
int k;
while(1)
{
k = recv(temp_sock_desc, buf, 100, 0);
if (recv == -1)
{
printf("\ncannot read from client!\n");
break;
}
if (recv == 0)
{
printf("\nclient disconnected.\n");
break;
}
if (k > 0)
printf("%*.*s", k, k, buf);
if (strcmp(buf, "exit") == 0)
break;
}
close(temp_sock_desc);
close(sock_desc);
printf("server disconnected\n");
return 0;
}
客户端:
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
//#include <fcntl.h>
#include <unistd.h>
main()
{
int sock_desc = socket(AF_INET, SOCK_STREAM, 0);
if (sock_desc == -1)
{
printf("cannot create socket!\n");
return 0;
}
struct sockaddr_in client;
memset(&client, 0, sizeof(client));
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr("127.0.0.1");
client.sin_port = htons(7777);
if (connect(sock_desc, (struct sockaddr*)&client, sizeof(client)) != 0)
{
printf("cannot connect to server!\n");
close(sock_desc);
}
char buf[100];
char c = '\n';
char *p_buf;
int k, len;
while(1)
{
gets(buf);
len = strlen(buf);
p_buf = buf;
while (len > 0)
{
k = send(sock_desc, p_buf, len, 0);
if (k == -1)
{
printf("cannot write to server!\n");
break;
}
p_buf += k;
len -= k;
}
k = send(sock_desc, &c, 1, 0);
if (k == -1)
{
printf("cannot write to server!\n");
break;
}
if (strcmp(buf, "exit") == 0)
break;
}
close(sock_desc);
printf("client disconnected\n");
return 0;
}
答案 1 :(得分:2)
在服务器端,您需要将地址127.0.0.1更改为0.0.0.0,以便从任何地方启用连接。您还可以使用telnet
而不是客户端代码,因此检查服务器是否按预期工作。还要研究你的各种Linux上是否有snoop
命令。
在客户端,您需要使用服务器计算机的IP地址
答案 2 :(得分:2)
您需要进行以下更改。
端口号 - 使用htons
即
服务器 - server.sin_port = htons(7777);
客户 - client.sin_port = htons(7777);
服务器 - 让它从任何地址接受 - 即server.sin_addr.s_addr = INADDR_ANY;
希望有所帮助
答案 3 :(得分:0)
它应该是这样的。
if (connect(sock_desc, (struct sockaddr*)&client, sizeof(client)) != 0)