本人初學網路編程,想實作一個回射服務器的功能,代碼如下:
服務器端代碼
#include<stdio.h>
#include<WinSock2.h>
#pragma comment (lib,"WS2_32.lib")
#define PORT 8888
#define ADDR "127.0.0.1"
int main()
{
char buf[100];
int iResult = 0;
SOCKET sconnection = INVALID_SOCKET;
struct sockaddr_in serAddr;
//套接字初始化
WSADATA mydata;
if (WSAStartup(MAKEWORD(2, 2), &mydata) != 0)
{
printf("套接字初始化失敗:%d\n", WSAGetLastError());
exit(0);
}
printf("初始化成功.......\n");
//創建套接字
if ((sconnection = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("創建套接字失敗:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
printf("TCP套接字創建成功......\n");
//設定服務器地址結構
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(PORT);
serAddr.sin_addr.S_un.S_addr = inet_addr(ADDR);
//連接到服務器
printf("正在連接到%s:%d\n", inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));
if (connect(sconnection, (struct sockaddr*) & serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("連接失敗:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("連接成功.......\n");
printf("準備發送資料....\n");
//發送緩沖區中的資料
while(1)
(
memset(buf, 0, sizeof(buf));//初始化緩沖區
printf("想要發送的資料為:\n");
gets(buf);
if (iResult = send(sconnection, buf, sizeof(buf), 0) == SOCKET_ERROR)
{
printf("發送資料失敗:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("資料發送成功到%s\n", inet_ntoa(serAddr.sin_addr));
memset(buf, 0, sizeof(buf));//初始化緩沖區
//接收服務器回傳的資料
if (iResult = recv(sconnection, buf, strlen(buf), 0) == SOCKET_ERROR)
{
printf("接收資料失敗:%d\n", WSAGetLastError());
}
printf("來自%s的資料已被成功接收\n", inet_ntoa(serAddr.sin_addr));
printf(buf);
);
printf("準備關閉連接.....\n");
closesocket(sconnection);
WSACleanup();
return 0;
}
客戶端代碼:
#include<stdio.h>
#include<WinSock2.h>
#pragma comment (lib,"WS2_32.lib")
#define PORT 8888
#define ADDR "127.0.0.1"
int main()
{
char buf[100];
int iResult = 0;
SOCKET sconnection = INVALID_SOCKET;
struct sockaddr_in serAddr;
//套接字初始化
WSADATA mydata;
if (WSAStartup(MAKEWORD(2, 2), &mydata) != 0)
{
printf("套接字初始化失敗:%d\n", WSAGetLastError());
exit(0);
}
printf("初始化成功.......\n");
//創建套接字
if ((sconnection = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("創建套接字失敗:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
printf("TCP套接字創建成功......\n");
//設定服務器地址結構
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(PORT);
serAddr.sin_addr.S_un.S_addr = inet_addr(ADDR);
//連接到服務器
printf("正在連接到%s:%d\n", inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));
if (connect(sconnection, (SOCKADDR *) & serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("連接失敗:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("連接成功.......\n");
printf("準備發送資料....\n");
//發送緩沖區中的資料
for (int i = 0;; i++)
{
memset(buf, 0, sizeof(buf));//初始化緩沖區
printf("想要發送的資料為:\n");
gets(buf);
if (iResult = send(sconnection, buf, sizeof(buf), 0) == SOCKET_ERROR)
{
printf("發送資料失敗:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("資料發送成功到%s\n", inet_ntoa(serAddr.sin_addr));
//memset(buf, 0, sizeof(buf));//初始化緩沖區
//接收服務器回傳的資料
if (iResult = recv(sconnection, buf, strlen(buf), 0) == SOCKET_ERROR)
{
printf("接收資料失敗:%d\n", WSAGetLastError());
}
printf("來自%s的資料已被成功接收\n", inet_ntoa(serAddr.sin_addr));
printf(buf);
}
printf("準備關閉連接.....\n");
closesocket(sconnection);
WSACleanup();
return 0;
}
除錯結果:


一旦除錯客戶端時,服務器端還沒接收資料就顯示這個錯誤。在網上找了很多資料,說是套接字問題,但有點看不太懂,希望大哥們給點建議思路啥的,不然我自己時解決不了這個問題哈。
uj5u.com熱心網友回復:
10038 WSAENOTSOCK服務器端代碼怎么沒有看到 listen accept 呢?
uj5u.com熱心網友回復:
哦哦,復制沒完全,馬上改uj5u.com熱心網友回復:
服務器端代碼:#include<stdio.h>
#include<WinSock2.h>
#pragma comment (lib,"WS2_32.lib")
#define PORT 8888
#define ADDR "127.0.0.1"
int main()
{
char buf[100];
int iResult = 0;
SOCKET listensocket = INVALID_SOCKET;
SOCKET newconnection=INVALID_SOCKET;
SOCKADDR_IN serAddr, cliAddr;
int cliAddrLen = sizeof(cliAddr);
//套接字初始化
WSADATA mydata;
if (WSAStartup(MAKEWORD(2, 2), &mydata) != 0)
{
printf("套接字初始化失敗:%d\n", WSAGetLastError());
exit(0);
}
printf("初始化成功.......\n");
//創建套接字
if ((listensocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("創建套接字失敗:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
printf("TCP套接字創建成功......\n");
//設定服務器地址結構
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(PORT);
serAddr.sin_addr.S_un.S_addr = inet_addr(ADDR);
//系結套接字
if (bind(listensocket, (struct sockaddr*) & serAddr, sizeof(serAddr))==SOCKET_ERROR)
{
printf("套接字系結失敗:%d\n", WSAGetLastError());
closesocket(listensocket);
WSACleanup();
return 0;
}
printf("系結套接字成功......\n");
//啟動監聽
if (listen(listensocket, 5) == SOCKET_ERROR)
{
printf("監聽失敗:%d\n", WSAGetLastError());
closesocket(listensocket);
WSACleanup();
return 0;
}
printf("等待來自一個埠為%d的請求\n", PORT);
//接收客戶端連接請求
if (newconnection = accept(listensocket, (struct sockaddr *) & cliAddr, &cliAddrLen)==INVALID_SOCKET)
{
printf("接受請求失敗:%d\n", WSAGetLastError());
closesocket(listensocket);
WSACleanup();
return 0;
}
printf("成功接受一個來自%s:%d的請求\n", inet_ntoa(cliAddr.sin_addr),ntohs(cliAddr.sin_port));
closesocket(listensocket);
printf("等待接收資料.......\n");
//存盤接收到的資料
memset(buf, 0, sizeof(buf));//格式化緩沖區
for(int i=0;;i++)
{
if((iResult=recv(newconnection, buf, sizeof(buf), 0))==SOCKET_ERROR)
{
printf("接收資料失敗:%d\n", WSAGetLastError());
closesocket(newconnection);
WSACleanup();
return 0;
}
//顯示收到的資料
printf(buf);
printf("\n");
//回傳接收到的資料
if (iResult = send(newconnection, buf, strlen(buf), 0) == SOCKET_ERROR)
{
printf("發送資料失敗:%d\n", WSAGetLastError());
}
}
//關閉套接字
closesocket(newconnection);
WSACleanup();
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/46961.html
標籤:網絡編程
上一篇:求基于LZW演算法的資料壓縮程式
