下面是关于C语言Socket编程开发应用示例的完整攻略:
什么是Socket编程?
Socket是计算机网络通信中的一种方式,它定义了两个网络应用程序之间的通信规则。Socket编程是指利用Socket进行网络编程,实现网络通信的一种技术。
Socket编程的基础知识
Socket编程主要有两个重要的函数:socket()和bind()。其中,socket()函数用于创建一个Socket,而bind()函数则是将一个Socket与一个本地IP地址和端口号绑定,使得其可以接受来自外部的连接请求。
下面是使用socket()和bind()函数创建和绑定Socket的示例代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
// 创建Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
return 1;
}
// 绑定Socket
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 8080;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
close(sockfd);
return 1;
}
// 监听Socket
listen(sockfd, 5);
clilen = sizeof(cli_addr);
// 接收连接
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
close(sockfd);
return 1;
}
// 读取数据
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);
if (n < 0) {
perror("ERROR reading from socket");
close(newsockfd);
close(sockfd);
return 1;
}
printf("Here is the message: %s\n", buffer);
// 向客户端发送数据
n = write(newsockfd, "I got your message", 18);
if (n < 0) {
perror("ERROR writing to socket");
close(newsockfd);
close(sockfd);
return 1;
}
// 关闭Socket
close(newsockfd);
close(sockfd);
return 0;
}
上述代码将创建一个Socket并绑定到本地的8080端口,随后进入监听状态。该程序支持一个客户端连接请求,一旦收到连接请求就会向客户端发送"I got your message"消息。
Socket编程应用实例
现在我们将使用Socket编程来创建一个简单的客户端/服务器应用程序。在这个例子中,客户端将向服务器请求当前时间,然后服务器将向客户端返回当前时间并在客户端上打印。
服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
// 创建Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
return 1;
}
// 绑定Socket
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 8080;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
close(sockfd);
return 1;
}
// 监听Socket
listen(sockfd, 5);
clilen = sizeof(cli_addr);
// 接收连接请求
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
close(sockfd);
return 1;
}
// 读取数据
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);
if (n < 0) {
perror("ERROR reading from socket");
close(newsockfd);
close(sockfd);
return 1;
}
// 获取当前时间
time_t t;
time(&t);
struct tm *local = localtime(&t);
char *result = asctime(local);
// 向客户端发送数据
n = write(newsockfd, result, strlen(result));
if (n < 0) {
perror("ERROR writing to socket");
close(newsockfd);
close(sockfd);
return 1;
}
// 关闭Socket
close(newsockfd);
close(sockfd);
return 0;
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main() {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
portno = 8080;
// 创建Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
return 1;
}
// 获取指定主机的信息
server = gethostbyname("localhost");
if (server == NULL) {
perror("ERROR, no such host");
return 1;
}
// 初始化服务器地址
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) {
perror("ERROR connecting");
return 1;
}
// 向服务器发送请求
n = write(sockfd, "Please send me current time.", 29);
if (n < 0) {
perror("ERROR writing to socket");
close(sockfd);
return 1;
}
// 从服务器接收结果
bzero(buffer, 256);
n = read(sockfd, buffer, 255);
if (n < 0) {
perror("ERROR reading from socket");
close(sockfd);
return 1;
}
// 打印当前时间
printf("%s", buffer);
// 关闭Socket
close(sockfd);
return 0;
}
在上述客户端/服务器应用程序中,客户端向服务器发送"Please send me current time."请求,一旦接收到请求,服务器将会返回当前时间。
我希望本攻略对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言socket编程开发应用示例 - Python技术站