Linux环境下socket编程,客户端服务端均已建立,但是就是通信不了,运行客户端please enter根本出不来
附上代码,大家帮忙看看,困扰许久
服务端
#include
#include
#include
#include
#include
#include
#include
int main(){
int listen_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listen_sockfd < 0){
perror("socket");
return 0;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(38989);
addr.sin_addr.s_addr = inet_addr("0.0.0.0"); /* 0.0.0.0: 表示当前机器当中的任意一块网卡地址 */
int ret = bind(listen_sockfd, (struct sockaddr*)&addr, sizeof(addr));
if(ret < 0){
perror("bind");
return 0;
}
ret = listen(listen_sockfd, 1);
if(ret < 0){
perror("listen");
return 0;
}
while(1){
int new_sockfd = accept(listen_sockfd, NULL, NULL);
if(new_sockfd < 0){
perror("accept");
return 0;
}
char buf[1024] = {0};
ssize_t recv_size = recv(new_sockfd, buf, sizeof(buf) - 1, 0);
if(recv_size < 0){
perror("recv");
return 0;
}else if(recv_size == 0){
close(new_sockfd);
return 0;
}else{
printf("client say: %s\n", buf);
}
memset(buf, '\0', 1024);
printf("please enter: ");
fflush(stdout);
std::cin >> buf;
send(new_sockfd, buf, strlen(buf), 0);
}
close(listen_sockfd);
return 0;
}
客户端
#include
#include
#include
#include
#include
#include
#include
int main(){
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sockfd < 0){
perror("socket");
return 0;
}
struct sockaddr_in svr_addr;
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons(38989);
svr_addr.sin_addr.s_addr = inet_addr("128.24.190.248");
int ret = connect(sockfd, (struct sockaddr*)&svr_addr, sizeof(svr_addr));
if(ret < 0){
perror("connect");
return 0;
}
while(1){
char buf[1024] = {0};
printf("please enter: ");
fflush(stdout);
std::cin >> buf;
send(sockfd, buf, strlen(buf), 0);
memset(buf, '\0', 1024);
ssize_t recv_size = recv(sockfd, buf, sizeof(buf) - 1, 0);
if(recv_size < 0){
perror("recv");
}else if(recv_size == 0){
close(sockfd);
return 0;
}else{
printf("server say: %s\n", buf);
}
sleep(1);
}
close(sockfd);
return 0;
}
检查客户端与服务器之间的网络连接是否正常。可以使用 ping 命令测试两台计算机之间的连通性。
检查客户端和服务器程序中的 IP 地址、端口号等参数是否正确,并且保证两者的设置相同。
确认服务器程序已经正确启动,并且正在监听指定的端口。可以使用 netstat 命令查看服务器程序是否在指定的端口上监听连接。
如果服务器程序运行于虚拟机内部,需要将虚拟机的网络适配器设置为桥接模式,以便让外部计算机能够连通虚拟机内部的 IP 地址。
检查客户端和服务器程序中的代码是否有错误,例如发送/���收数据时是否出现了类型不匹配、缓冲区溢出等问题。
可以考虑在客户端程序中添加调试输出语句,以便快速定位问题所在
以下是一个简单的 Linux 环境下基于 socket 的客户端服务端通信代码:
服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char *hello = "Hello from server";
// 创建 socket 文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口号
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定 socket 到指定的地址和端口号上
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Waiting for client connection...\n");
// 接受连接请求,创建新的 socket 文件描述符
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
perror("accept");
exit(EXIT_FAILURE);
}
printf("Client connected successfully!\n");
// 从客户端接收数据,并回复消息
while(1) {
memset(buffer, 0, sizeof(buffer));
if (recv(new_socket, buffer, 1024, 0) < 0) {
perror("recv");
exit(EXIT_FAILURE);
}
printf("Message from client: %s\n", buffer);
send(new_socket , hello , strlen(hello) , 0 );
printf("Hello message sent to client!\n");
}
return 0;
}
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define PORT 8080
int main(int argc, char const *argv[]) {
int sock = 0, valread;
struct sockaddr_in serv_addr;
char buffer[1024] = {0};
const char *hello = "Hello from client";
// 创建 socket 文件描述符
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
// 设置服务器地址和端口号
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将 IPv4 地址从文本转换为二进制格式
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
// 连接服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
// 发送消息到服务器
send(sock , hello , strlen(hello) , 0 );
printf("Hello message sent to server!\n");
// 从服务器接收消息并显示
if ((valread = read( sock , buffer, 1024)) < 0) {
printf("\nRead error \n");
}
printf("Message from server: %s\n", buffer );
return 0;
}
```
看你这里是一个TCP的客户端和服务器通讯的程序,你从以下几个方面来排查问题:
1、首先确定你的服务器的ip地址是否是:128.24.190.248;
2、确认下你这里的服务器程序与客户端程序,哪个软件先运行(注意:正确的应该是先运行服务器,再运行客户端);
3、服务器的程序里应该是有问题的,以当前代码来看,每次接收数据必须先建立连接;而你的客户端程序实际上只会建立一次连接。因此服务器和客户端的程序不匹配。
如有问题,可以私聊!
本段内容主要是编写一个服务器与一个客户端之间通信模型,来熟悉socket的使用。
通信过程是最简单的模型,首先是客户端与服务器之间建立连接,后客户端与服务器通信,最后两者断开连接。以下是,客户端与服务器通信流程图。
下面将详细介绍socket编程用到的API函数,以及一些使用注意事项。