/*
socket:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);//领域,类型,协议
#pragma pack(1)
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main()
{
int sock_listen=socket(AF_INET, SOCK_STREAM, 0);
//sock_listen用于存放新创建的套接字的描述符
/*
AF_INET: 使用Internet地址家族,即采用TCP/IP协议族标准,几乎是固定的
SOCK_STREAM: 表示创建的是流套接字
0: 表示使用默认的协议编号,即TCP协议对应的编号
*/
//1024以下的端口号称为熟知端口号,它们被很多常用的软件所使用,比如Web服务器通常都使用80号端口,FTP服务器通常使用20和21号端口,所以我们的程序建议不要使用1024以下的端口号,以免和它们冲突
struct sockaddr_in myaddr;
myaddr.sin_family=AF_INET; //指定地址家族为Internet地址家族
myaddr.sin_addr.s_addr=INADDR_ANY; //指定IP地址为本机任意IP
myaddr.sin_port=htons(55555); //指定端口号为55555
//printf("%d\n",htons(55555));
//htons:将一个短整型的数据从主机字节序转换为网络字节序
//没有绑定的套接字称为野套接字,即Floating Socket
if(-1==bind(sock_listen, (struct sockaddr*)&myaddr, sizeof(myaddr)))
{
perror("绑定失败");
return 1;
}
listen(sock_listen, 5); //将sock_listen这个套接字设置为监听状态
//5表示监听等待队列的长度为5
//accept函数:接收一个客户端连接请求,即建立了一个连接,返回值为这个连接对应的套接字描述符,这个套接字是专门用来在这条连接通道上进行通信的,称为连接套接字。如果调用accept时没有连接请求到来,该函数会阻塞当前线程的执行
int sock_conn=accept(sock_listen, NULL, NULL);
char msg[1000]="hello,guy!";
send(sock_conn, msg, strlen(msg),0); //通过sock_conn连接套接字将msg发送给客户端,0表示默认的发送行为
//recv返回值为实际成功接收的字节数
int ret=recv(sock_conn,msg,sizeof(msg)-1,0); //0表示默认的接收行为
msg[ret]='\0';
printf("客户端说:%s\n", msg);
close(sock_conn); //通信完毕后关闭连接套接字,即断开和客户端的连接
close(sock_listen); //如果不希望再接收其他客户端的连接请求,可以关闭监听套接字
return 0;
}
套接字编程
最新推荐文章于 2023-07-20 20:40:52 发布