套接字之tcp通信

简言

  TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议.相对比udp要慢一些.

服务端server.c

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <Windows.h>

#pragma comment (lib,"ws2_32.lib")

int main(int argc, char *argv[])
{
	//发送的字符串
	char sendbuffer[128] = { 0 };
	//接收的字符串
	char receivebuffer[128] = { 0 };
	//发送的长度
	int sendLength = 0;
	//接收长度
	int receiveLength = 0;
	//SOCKADDR 地址长度
	int len;

	SOCKET socket_send;
	SOCKET socket_receive;

	SOCKADDR_IN send_addr;
	SOCKADDR_IN receive_addr;
	WORD version = MAKEWORD(2, 2);

	WSADATA wsadata;

	//获取版本,建立通信
	int result = WSAStartup(version, &wsadata);
	if (result != 0)
	{
		printf("出现错误!\n");
		return 0;
	}

	//1.设置连接地址
	send_addr.sin_family = AF_INET;
	send_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	send_addr.sin_port = htons(8089);
	//2.创建套接字,接受消息
	socket_send = socket(AF_INET, SOCK_STREAM, 0);
	//3.绑定地址,端口
	bind(socket_send, (SOCKADDR *)&send_addr, sizeof(SOCKADDR));

	//4.监听
	int listenResult = listen(socket_send, 5);
	if (listenResult == -1)
	{
		printf("绑定端口失败!\n");
		return 0;
	}
	//5.接受消息
	len = sizeof(SOCKADDR);
	socket_receive = accept(socket_send, (SOCKADDR *)&receive_addr, &len);
	while (1)
	{
		//接受消息
		receiveLength = recv(socket_receive, receivebuffer, 128, 0);
		printf("server recv:%s\n", receivebuffer);
		memset(receivebuffer, 0, 128);

		//发送消息
		printf("server send:");
		scanf("%s", sendbuffer);
		sendLength = send(socket_receive, sendbuffer, sizeof(sendbuffer), 0);

		memset(sendbuffer, 0, 128);
	}
	closesocket(socket_receive);
	closesocket(socket_send);
	WSACleanup();
	system("pause");
	return 0;
}

客户端 client.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <Windows.h>

#pragma comment (lib,"ws2_32.lib")

int main(int argc, char *argv[])
{
	//发送的字符串
	char sendbuffer[128] = { 0 };
	//接收的字符串
	char receivebuffer[128] = { 0 };
	//发送的长度
	int sendLength = 0;
	//接收长度
	int receiveLength = 0;
	//SOCKADDR 地址长度
	int len;

	SOCKET socket_send;


	SOCKADDR_IN send_addr;

	WORD version = MAKEWORD(2, 2);

	WSADATA wsadata;

	//获取版本,建立通信
	int result = WSAStartup(version, &wsadata);
	if (result != 0)
	{
		printf("出现错误!\n");
		return 0;
	}
	send_addr.sin_family = AF_INET;
	send_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	send_addr.sin_port = htons(8089);

	socket_send = socket(AF_INET, SOCK_STREAM, 0);
	connect(socket_send, (SOCKADDR *)&send_addr, sizeof(SOCKADDR));

	while (1)
	{
		printf("client send:");
		scanf("%s", sendbuffer);
		sendLength = send(socket_send, sendbuffer, strlen(sendbuffer) + 1, 0);
		
		memset(sendbuffer, 0, 128);
		receiveLength = recv(socket_send, receivebuffer, 128, 0);
		printf("client recv:%s\n", receivebuffer);
		
		memset(receivebuffer, 0, 128);
	}

	closesocket(socket_send);
	WSACleanup();
	system("pause");
	return 0;
}


 
秋风 2016-08-01