gpt4 book ai didi

c - 简单的套接字编程代码工作

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:51 25 4
gpt4 key购买 nike

我正在尝试使用这些用于 TCP-IP 服务器和客户端的简单示例 C++ 代码来研究和理解 BSD 套接字编程。我已经阅读了标准 API,例如 socket()、bind()、listen()、accept() 和 read/recv(),甚至还获得了以下代码以在 g++/Linux 上进行编译。

我想做的是看到它在现实生活中工作,我的意思是运行服务器代码,然后使用客户端连接到它并从客户端到服务器发送数据,反之亦然,并验证收到的数据。所有这些都在我同一个网段中的两个 linux boxes(Ubuntu) 中。我为这两台 Linux 机器提供了私有(private) 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;
}

最佳答案

在您的代码中添加一些错误处理,这可能会揭示一些东西,例如:

服务器:

#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;
}

关于c - 简单的套接字编程代码工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com