// tcp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
void initialzation();
int main() {
int send_len = 0;
int recv_len = 0;
int len = 0;
char send_buf[100];
char recv_buf[100];
SOCKET s_server;
SOCKET s_accept;
SOCKADDR_IN server_addr;
SOCKADDR_IN accept_addr;
initialzation();
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // 设置服务器的IP
server_addr.sin_port = htons(8080); // 设置服务器的端口
//server_addr.sin_addr.s_addr = inet_addr("192.168.0.122");
s_server = socket(AF_INET, SOCK_STREAM, 0);
if(bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR){ // 绑定IP和端口
cout << "套接字绑定失败!" << endl;
WSACleanup();
}
else{
std::cout << "套接字绑定成功!" << std::endl;
}
if(listen(s_server, SOMAXCONN) < 0){ // 监听
std::cout << "设置监听状态失败" << std::endl;
WSACleanup();
}
else{
std::cout<<"设置监听状态成功" << std::endl;
}
std::cout << "服务器正在监听连接, 请稍后。。。"<< std::endl;
len = sizeof(SOCKADDR);
s_accept = accept(s_server, (SOCKADDR *)&accept_addr, &len); // 套接字接收连接
if(s_accept == SOCKET_ERROR){
std::cout << "连接客户端失败!" << std::endl;
WSACleanup();
return 0;
}
else{
std::cout << " 连接成功, 准备接收数据!" << std::endl;
}
while(1){
memset(recv_buf, 0, sizeof(recv_buf));
recv_len = recv(s_accept, recv_buf, sizeof(recv_buf), 0); // 接收客户端发送过来的数据
if(recv_len < 0){
std::cout << "接收数据失败" << std::endl;
break;
}
else{
std::cout << inet_ntoa(accept_addr.sin_addr) <<":"<<recv_buf<< endl;
}
std::cout << "输入回复客户端消息:";
std::cin >> send_buf; // 写入回复的数据
send_len = send(s_accept, send_buf, sizeof(send_buf), 0); // 发送数据
if(send_len < 0){
std::cout << "发送失败" << std::endl;
break;
}
}
closesocket(s_server);
closesocket(s_accept);
WSACleanup();
return 0;
}
void initialzation() {
WORD w_rep = MAKEWORD(2,2);
WSADATA wsadata;
int err;
err = WSAStartup(w_rep, &wsadata);
if(0 != err){
std::cout << "初始化套接字失败!" << std::endl;
}
else{
std::cout << "初始化套接字成功!" << std::endl;
}
if(LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2){
std::cout << "套接字库版本号不符!" << std::endl;
WSACleanup();
}
else{
std::cout << "套接字库版本号正确!" << std::endl;
}
}
原文链接: https://www.cnblogs.com/caozewen/p/15831010.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/187034
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!