现在的位置: 首页 > 综合 > 正文

TCP网络通信实例–消息的发送与接收

2013年08月20日 ⁄ 综合 ⁄ 共 2836字 ⁄ 字号 评论关闭

TCP网络通信示例,用服务器等待客户端连接,并且在客户端连接后发送一个消息后切断。

服务器端:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

#if defined(UNIX)
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#elif defined(WINDOWS)
#include <Winsock2.h>
#define bzero(p, len) memset((p), 0, (len))
#endif

#define BUFFER_SIZE 1024
#define SERVER_ADDR "127.0.0.1"
#define SERVER_PORT 8089

int main(int argc, const char *argv[])
{
#if defined(WINDOWS)
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(1, 1);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0) {
		printf("WSAStartup failed\n");
		return -1;
	}
#endif
	char buffer[BUFFER_SIZE];
	int server_fd, client_fd;
	struct sockaddr_in cliaddr, servaddr;
	if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
		printf("create socket failed\n");
		exit(-1);
	}
	bzero(&(servaddr.sin_zero), sizeof(servaddr.sin_zero));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(SERVER_PORT);
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	bind(server_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
	if (listen(server_fd, 5) == -1)
	{
		printf("listen failed\n");
		exit(-1);
	}
	printf("listen\n");
	while (1)
	{
#if defined(UNIX)
		unsigned int sin_size = sizeof(struct sockaddr_in);
#elif defined(WINDOWS)
		int sin_size = sizeof(struct sockaddr_in);
#endif
		if ((client_fd = accept(server_fd, (struct sockaddr *)&servaddr, &sin_size)) == -1)
		{
			continue;
		}
		char *client_ip_addr_buffer;
		client_ip_addr_buffer = inet_ntoa(cliaddr.sin_addr);
		char message[] = "Hello, World! from server!\n";
		sprintf(buffer, "%s", message);
		if (send(client_fd, buffer, strlen(buffer), 0) == -1)
		{
			printf("send failed\n");
		}
#if defined(UNIX)
		close(client_fd);
#elif defined(WINDOWS)
		closesocket(client_fd);
#endif
	}
#if defined(UNIX)
	close(server_fd);
#elif defined(WINDOWS)
	closesocket(server_fd);
	WSACleanup();
#endif
	return 0;
}

客户端:

#if defined(UNIX)
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#elif defined(WINDOWS)
#include <Winsock2.h>
#define bzero(p, len) memset((p), 0, (len))
#endif

#define SERVER_ADDR "127.0.0.1"
#define SERVER_PORT 8089

int main(int argc, const char *argv[])
{
#if defined(WINDOWS)
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(1, 1);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
	printf("WSAStartup failed\n");
	return -1;
    }
#endif
    int sockfd;
    struct sockaddr_in servaddr;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
	printf("create socket failed\n");
	exit(-1);
    }
    bzero(&servaddr, sizeof(servaddr));
#if defined(UNIX)
    inet_pton(AF_INET, SERVER_ADDR, &servaddr.sin_addr);
#elif defined(WINDOWS)
    servaddr.sin_addr.S_un.S_addr = inet_addr(SERVER_ADDR);
#endif
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERVER_PORT);
    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)) == -1)
    {
	printf("connect failed\n");
	exit(-1);
    }
    char buffer[255];
    size_t recv_len;
    recv_len = recv(sockfd, buffer, 255, 0);
    int i;
    for (i = 0; i < recv_len; i++) {
	printf("%c", buffer[i]);
    }

#if defined(UNIX)
    close(sockfd);
#elif defined(WINDOWS)
    closesocket(sockfd);
    WSACleanup();
#endif
    return 0;
}

抱歉!评论已关闭.