:!man socket
#include
#include
int socket(int domain, int type, int protocol);
domain | 说明 |
---|---|
AF_INET | IPV4协议 |
AF_INET6 | IPV6协议 |
AF_LOCAL | Unix域协议 |
type | 说明 |
---|---|
SOCK_STREAM | 字节流套接字(TCP/SCTP) |
SOCK_DGRAM | 数据报套接字(UDP) |
SOCK_RAM | 原始套接字 (IPv4/IPv6) |
SOCK_SEQPACKET | 有序分组套接字(SCTP) |
protocol | 说明 |
---|---|
IPPROTO_CP | TCP传输协议 |
IPPROTO_UDP | UDP传输协议 |
IPPROTO_SCTP | SCTP传输协议 |
socket函数在成功时会返回一个小的非负整数值,它与文件描述符类似,就称它为套接字描述符。只需要指定协议族(IPV4、IPV6或Unix)和套接字类型即可
socket_fd=socket(AF_INET,SOCK_STREAM,0);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
connect() 函数用于在客户端应用程序中与服务器建立连接。需要注意的是,connect() 函数可能会阻塞,直到连接成功建立或发生错误。因此,您可以使用适当的超时机制或非阻塞 Socket 设置来控制连接过程的行为。
入参:
返回值:
#define SERVER_PORT 8596
#define MESSAGE_LENGTH 1024
int ret = -1;
int socket_fd;
//server addr
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
serverAddr.sin_addr.s_addr = inet_addr(args[1]);
if(connect(socket_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){
perror("connect error");
return 1;
}
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
send 是一个在网络编程中使用的函数,用于发送数据到已连接的套接字或发送数据报套接字中。
入参:
返回值
#define MESSAGE_LENGTH 1024
char sendbuf[MESSAGE_LENGTH];
while(1)
{
memset(sendbuf, 0, MESSAGE_LENGTH);
printf("send message:");
fgets(sendbuf,MESSAGE_LENGTH,stdin);
//printf("\n");
ret = send(socket_fd, sendbuf, strlen(sendbuf), 0);
if(ret <= 0 ){
printf("the connection is disconnection!\n");
break;
}
}
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
recv 是一个在网络编程中使用的函数,用于接收数据从已连接的套接字或接收数据报套接字中。
需要注意的是,recv 函数是一个阻塞调用,即在没有数据到达之前,它会一直等待。如果需要非阻塞的操作,可以使用非阻塞 I/O 或多线程/多进程的方式处理接收操作。
入参:
返回值:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 8596
#define MESSAGE_LENGTH 1024
int main(int argc,char* args[])
{
int ret = -1;
int socket_fd;
//server addr
struct sockaddr_in serverAddr;
char sendbuf[MESSAGE_LENGTH];
char recvbuf[MESSAGE_LENGTH];
int data_len;
if((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return 1;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
serverAddr.sin_addr.s_addr = inet_addr(args[1]);
if(connect(socket_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
perror("connect");
return 1;
}
printf("success to connect server...\n");
while(1)
{
memset(sendbuf, 0, MESSAGE_LENGTH);
printf("send message:");
fgets(sendbuf,MESSAGE_LENGTH,stdin);
//printf("\n");
ret = send(socket_fd, sendbuf, strlen(sendbuf), 0);
if(ret <= 0 ){
printf("the connection is disconnection!\n");
break;
}
if(strcmp(sendbuf, "quit") == 0){
break;
}
printf("receive message:");
recvbuf[0] = '\0';
data_len = recv(socket_fd, recvbuf, MESSAGE_LENGTH, 0);
recvbuf[data_len] = '\0';
printf("%s\n", recvbuf);
}
close(socket_fd);
return 0;
}