以下是一个简单的C++通讯程序示例,使用socket实现了客户端与服务端的简单通信。
服务端代码:
[code]
++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8080
int main(int argc, char *argv[]) {
int sockfd, newsockfd, n;
socklen_t clientlen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror(\"Error opening socket\");
exit(1);
}
// 绑定端口号
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror(\"Error on binding\");
exit(1);
}
// 监听端口
listen(sockfd, 5);
printf(\"Server: Listening on port %d...\\n\", PORT);
// 接受客户端连接
clientlen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clientlen);
if (newsockfd < 0) {
perror(\"Error on accept\");
exit(1);
}
printf(\"Server: Client connected from %s:%d\\n\",
inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
// 读取客户端消息
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);
if (n < 0) {
perror(\"Error reading from socket\");
exit(1);
}
printf(\"Server: Here is the message received: %s\\n\", buffer);
// 发送响应给客户端
n = write(newsockfd, \"I got your message\", 18);
if (n < 0) {
perror(\"Error writing to socket\");
exit(1);
}
close(sockfd);
close(newsockfd);
return 0;
}
[/code]
客户端代码:
[code]
++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#define PORT 8080
int main(int argc, char *argv[]) {
int sockfd, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
if (argc < 2) {
fprintf(stderr,\"usage %s hostname\\n\", argv[0]);
exit(1);
}
// 获取服务器地址
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr, \"Error, no such host\\n\");
exit(0);
}
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror(\"Error opening socket\");
exit(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(PORT);
// 连接到服务器
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
perror(\"Error connecting\");
exit(1);
}
printf(\"Client: Connected to server %s:%d\\n\",
inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
// 发送消息给服务端
printf(\"Client: Please enter the message: \");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd, buffer, strlen(buffer));
if (n < 0) {
perror(\"Error writing to socket\");
exit(1);
}
// 读取服务端响应
bzero(buffer, 256);
n = read(sockfd, buffer, 255);
if (n < 0) {
perror(\"Error reading from socket\");
exit(1);
}
printf(\"Client: Here is the message received: %s\\n\",buffer);
close(sockfd);
return 0;
}
[/code]
运行服务端程序后,可以使用客户端程序与其通讯。 |