linux下建立socket的一点点小问题,求解
发布网友
发布时间:2022-05-10 21:50
我来回答
共2个回答
热心网友
时间:2023-11-04 19:45
这是一个socket程序,基于tcp,是一个client客户端程序。
你需要一个对应的server服务端程序。
connect(s,&addr,sizeof(addr);这句话是去连接SERVER_IP所在的socket服务器。
以下是服务端代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
int socket_init()
{
int fd;
struct sockaddr_in my_addr; /* 本机地址信息 */
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket创建出错!");
return -1;
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind出错!");
return -1;
}
if (listen(fd, BACKLOG) == -1) {
perror("listen出错!");
return -1;
}
return fd;
}
int main()
{
int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
if((sockfd = socket_init()) < 0)
{
printf("init error!\n");
return -1;
}
printf("socket init ok, fd = %d\n", sockfd);
socklen_t sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
perror("accept出错");
continue;
}
else
{
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
break;
}
……//接下来就可以通过client_fd 和客户端进行TCP数据的收发。
}
注:服务端和客户端的端口号要一致。追问那请问这个服务器端的内容应该放在什么位置?
我现在有的环境是局域网内的多台Linux
这个服务器端程序编译通过之后生成的可执行文件应该放在服务器环境的哪个目录下,有什么环境要求吗?
追答随便哪个目录,运行server端之后,server端就会监听网口。
收到其他client端的connect连接请求时,就和client端通过TCP协议的三次握手,
建立连接。
然后两端就可以互相通讯了。send和recv。
如果你是多个client连接同一个server端,那么server端在accept这里,需要不停的接收连接请求,然后创建进程(fork函数)或者线程(pthread_create函数),来分别处理接收到的client。
热心网友
时间:2023-11-04 19:46
加 西嵌之家 技术交流群