socket()函数的概念和使用案例
socket()函数的概念(C语言)
在C语言中,socket()
函数是用于创建一个新的套接字,它是网络编程的基础。套接字可以看作是不同计算机进程间通信的一个端点,允许数据在网络中的发送和接收。
socket()
函数的原型定义在 <sys/socket.h>
头文件中,如下所示:
int socket(int domain, int type, int protocol);
domain
:指定套接字的通信域,例如AF_INET
表示IPv4协议,AF_INET6
表示IPv6协议。type
:指定套接字的类型,例如SOCK_STREAM
表示流式套接字(用于TCP),SOCK_DGRAM
表示数据报套接字(用于UDP)。protocol
:通常设置为0,表示选择默认协议。当指定了type
时,这个参数通常是不必要的,因为类型已经隐含了协议。
socket()
函数成功时返回一个小的非负整数值,称为套接字描述符,失败时返回-1。
使用案例
案例1:创建TCP客户端
以下是一个简单的C语言TCP客户端示例,它连接到一个服务器,发送一条消息,然后接收服务器的响应。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void error(const char *msg) {
perror(msg);
exit(0);
}
int main(int argc, char *argv[]) {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
close(sockfd);
return 0;
}
在这个例子中,程序创建了一个TCP套接字,连接到由命令行参数指定的服务器和端口,然后发送用户输入的消息,并打印出服务器的响应。
请注意,为了简化示例,错误处理只是打印错误消息并退出程序。在实际应用中,应该有更完善的错误处理机制。此外,这个客户端只能发送和接收一次消息,它不是一个持续运行的客户端。