socket编程入门篇(一)

先贴代码:

服务端代码:

#include <Winsock2.h>
#include <iostream>
int main(int argc, char* argv[]) 
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);
	if (WSAStartup(sockVersion, &wsaData) != 0) {
		return 0;
	}
	SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sListen == INVALID_SOCKET) {
		printf("socket error\n");
		return 0;
	}
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(4500);
	sin.sin_addr.S_un.S_addr = INADDR_ANY;
	if (bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {
		printf("socket error\n");
		closesocket(sListen);
		return 0;
	}
	if (listen(sListen, 5) == SOCKET_ERROR) {
		printf("socket error\n");
		closesocket(sListen);
		return 0;
	}
	struct sockaddr_in remoteAddr;
	SOCKET sClient;
	int nAddrLen = sizeof(remoteAddr);
	char revData[255];
	while (TRUE) {
		sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
		if (sClient == SOCKET_ERROR) {
			printf("accept() error\n");
			continue;
		}
		printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
		int ret = recv(sClient, revData, 255, 0);
		if (ret > 0) {
			revData[ret] = 0x00;
			printf(revData);
		}
		char* buff = (char*)"\r\nHello, my friend\r\n";
		send(sClient, buff, strlen(buff), 0);
		closesocket(sClient);
	}
	closesocket(sListen);
	WSACleanup();
	return 0;
}

服务端调用socket(),bind(),listen(),accept()函数。调用send和recv函数传递信息。 

客户端代码:

#include "WinSock2.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) 
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);
	if (WSAStartup(sockVersion, &wsaData) != 0) {
		return 0;
	}
	SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sClient == SOCKET_ERROR) {
		printf("socket error\n");
		return 0;
	}
	struct sockaddr_in servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_port = htons(4500);
	servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	if (connect(sClient, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {
		printf("socket error\n");
		closesocket(sClient);
		return 0;
	}
	char* buff = (char*)"\r\nHello, my friend\r\n";
	send(sClient, buff, strlen(buff), 0);
	char revData[255];
	int ret = recv(sClient, revData, 255, 0);
	if (ret > 0) {
		revData[ret] = 0x00;
		printf(revData);
	}
	closesocket(sClient);
	WSACleanup();
	return 0;
}

客户端调用socket(),connect()函数。 调用send和recv函数传递信息。

项目需要配置ws2_32.lib,并关闭SDL检查。

参考博客:https://www.cnblogs.com/jikexianfeng/p/5729168.html。 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一 个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序。 服务端 和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。 比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。 [代码] [C/C++]代码 /******* 服务器程序 (server.c) ************/ #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[]="Hello! Are You Fine?\n"; if(argc!=2) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } if((portnumber=atoi(argv[1]))<0) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } /* 服务器端开始建立socket描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&server;_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)(&server;_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); } /* 监听sockfd描述符 */ if(listen(sockfd,5)==-1) { fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); exit(1); } while(1) { /* 服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(
修改代码输出时间的方式放止段吐核#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <time.h> // 添加时间头文件int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字 if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); // 监听套接字 if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接 if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); // 添加时间输出 time_t now = time(NULL); struct tm* time_info = localtime(&now); char time_str[20]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info); printf("当前时间是:%s\n", time_str); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); close(client_socket); } close(server_socket); return 0;}
06-10
代码已经添加了时间头文件,只需要在连接建立后输出时间即可。可以将时间获取和输出的代码放在连接建立后的代码块中。修改后的代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <time.h> int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); // 输出时间 time_t now = time(NULL); struct tm* time_info = localtime(&now); char time_str[20]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info); printf("当前时间是:%s\n", time_str); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); close(client_socket); } close(server_socket); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值