c_cpp 套接字连接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 套接字连接相关的知识,希望对你有一定的参考价值。
/*
1.创建listen监听套接字;
2.填写本地网络地址信息;
3.将监听套接字与网络地址信息进行绑定bind;
4.设置为listen状态监听网络中的连接请求;
5.accept接收远端client发送的连接请求,是TCP中建立连接的三次握手过程;
6.连接建立完毕进行数据接收;
*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#define _BACKLOG_ 3 //监听状态中允许等待队列中请求的最大数
void usage(const char *argv) //传参判断错误输出
{
printf("%s [ip] [port]\n", argv);
exit(1);
}
int creat_listen_socket(int ip, int port)//创建监听socket
{
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror("socket");
exit(2);
}
struct sockaddr_in server; // 创建本地 server 网络地址信息
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = ip;
if (bind(sock, (struct sockaddr*)&server, sizeof(server)) < 0) //绑定
{
perror("bind");
exit(3);
}
if (listen(sock, _BACKLOG_) < 0)
{
perror("listen");
exit(4);
}
return sock;
}
int main(int argc, char *argv[])
{
if (argc != 3)
{
usage(argv[0]);
}
int ip = inet_addr(argv[1]);
int port = atoi(argv[2]);
int listen_sock = creat_listen_socket(ip, port);
struct sockaddr_in client; //创建client网络地址结构体,用于存放
socklen_t client_len = sizeof(client);
while(1)
{
//处理连接请求,在accept阶段就是处理TCP三次握手连接的过程
int accept_sock = accept(listen_sock, (struct sockaddr*)&client, &client_len);
char *client_ip = inet_ntoa(client.sin_addr);
int client_port = ntohs(client.sin_port);
if(accept_sock < 0)
{
perror("accept");
continue;
}
printf("client ip: %s port: %d\n", client_ip, client_port);
//将客户端的信息进行输出
char buf[1024];
while(1)
{
memset(buf, '\0', sizeof(buf));
ssize_t size = read(accept_sock, buf, sizeof(buf)-1);
if(size < 0)
{
perror("read");
break;
}
else if(size == 0)
{
printf("client %s is out...\n", client_ip);
exit(5);
}
else
printf("client# %s\n", buf);
}
}
return 0;
}
/*
1.创建本地套接字client_socket;
2.因为是发送连接请求的一方,所以并不需要监听,也并不需要绑定本地网络地址信息,注意并不是不可以绑定,而是没有必要,因为在发送请求时系统已经默认分配了一个端口号且将IP地址和端口号一并发送了过去;
3.进行连接请求connect;
4.连接建立完毕进行数据发送;
*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
void usage(const char* argv)//同样进行参数错误判断输出
{
printf("%s [ip] [port]\n", argv);
exit(1);
}
int main(int argc, char *argv[])
{
if(argc != 3)
usage(argv[0]);
int server_ip = inet_addr(argv[1]);
int server_port = atoi(argv[2]);
int client_sock = socket(AF_INET, SOCK_STREAM, 0); //创建客户端socket
if(client_sock < 0)
{
perror("socket");
exit(2);
}
//只是这里需要填写要接收连接请求一方的网络地址信息,也就是远端server的地址信息
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(server_port);
server.sin_addr.s_addr = server_ip;
//进行连接,发送连接请求
if(connect(client_sock, (struct sockaddr*)&server, sizeof(server)) < 0)
{
perror("connect");
exit(3);
}
char buf[1024];
while(1)
{
memset(buf, '\0', sizeof(buf));
// gets(buf);
scanf("%s", buf);
ssize_t size = write(client_sock, buf, sizeof(buf));
if(size < 0)
{
perror("write");
continue;
}
}
return 0;
}
以上是关于c_cpp 套接字连接的主要内容,如果未能解决你的问题,请参考以下文章