// server.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加靜態連接庫文件 void main(int argc,char* argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(1,1),&wsadata); SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //socket() /***地址結構體***/ SOCKADDR_IN addrSvr; addrSvr.sin_family=AF_INET; addrSvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSvr.sin_port=htons(6000); /**************/ bind(sockSrv,(SOCKADDR*)&addrSvr, sizeof(SOCKADDR)); //bind() listen(sockSrv,5); //listen() SOCKADDR_IN addrClient; int len= sizeof(SOCKADDR); while(1) //加循環是爲了應對多個客戶端鏈接此服務器的狀況 { SOCKET socksend=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //accept() char sendBuf[50]; // sprintf(sendBuf,"你好,我是服務器"); //使用sprintf給字符串賦值、鏈接字符串比較方便 send(socksend,sendBuf,strlen(sendBuf)+1,0); //send(),+1是由於字符串以'\0'結尾 char recvBuf[50]; recv(socksend,recvBuf,50,0); //recv() printf("%s\n",recvBuf); closesocket(socksend); } /*closesocket(sockSrv); WSACleanup();*/ //while(1)後的死代碼 }
// Client.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加靜態連接庫文件 void main(int argc,char* argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(1,1),&wsadata); SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0); //socket() /***地址結構體***/ SOCKADDR_IN addrSvr; addrSvr.sin_family=AF_INET; addrSvr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSvr.sin_port=htons(6000); /**************/ connect(socketClient,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR)); //connect() char recvBuf[50]; recv(socketClient,recvBuf,50,0); //recv() printf("%s\n",recvBuf); send(socketClient,"你好,我是客戶端",strlen("你好,我是客戶端")+1,0); //send() closesocket(socketClient); WSACleanup(); }
Mac下編程用什麼替換windows.h頭文件?html
我在mac下編程,想使用清屏指令cls很差使,也不能用windows.h頭文件。請你們幫我想一想怎麼辦。還有在mac下能用system" "麼?macos
- 不行,你不能在除了 Windows 的任何系統上使用 Windows.h。你要理解 API 的概念,windows.h 這個頭文件是 Windows 帶的,而不是 C 語言自身有的。事實上,出了 Windows,沒有任何系統——實際上也是在真真切切用 C 的系統——例如全部在跑類 Unix,好比 OS X、Linux 甚至 FreeBSD 上的,都不能用 Windows 這套 API。這也是爲何坊間都說 OS X 是適合作編程,特別是適合學編程的,由於 OS X 是「體制內」,也就使用和全世界除了 Windows 以外全部的東西都互通的底層架構的,並且它在過去的大部分時候都要比各種 Linux 要容易上手,所謂的「更優雅」。
……編程
在百度知道上看到了這段對話後感受已經涼了,還好我有windows8.1虛擬機,這回不再怕找不到windows頭文件了吧!windows
致命錯誤C1010,在尋找預編譯指示頭文件時,文件未預期結束。就是沒有找到預編譯指示信息的問文件。顧名思義就是預編譯由於缺乏了預編譯文件而失敗。解決方法顯然能夠取消預編譯,或者幫助編譯器找到預編譯文件。數組
#include "stdafx.h"
不知道是否是編譯環境不一樣的緣由,學校電腦上的地址結構體成員addrSvr.sin_Family
到我win8.1虛擬機上就必須改爲addrSvr.sin_family
了,滿臉黑線= =
安全
本身疏忽緣由,在前面加上char sendBuf[50]
便可~
至此,編譯終於成功經過orz...
服務器
點擊運行,彈出Windows防火牆……
點擊"容許訪問"後,額……
??☺???網絡
百度一下,發現又打開了一個新世界的大門:架構
問題根源:app
在windows平臺下,ms的編譯器(也就是vc帶的那個)在 Debug 模式下,會把未初始化的棧內存所有填成 0xcc,用字符串來看就是」燙燙燙燙燙燙燙」,未初始化的堆內存所有填成0xcd,字符串看就是「屯屯屯屯屯屯屯屯」。
說人話:定義的字符串沒有初始化就會出現這樣的狀況
解決辦法:初始化一下
- char p[] = 「0」;
- ZeroMemory
- memset
那麼這裏是因爲先運行client.c再運行server.c致使
char recvBuf[50]; recv(socksend,recvBuf,50,0); //recv()
中數組recvBuf
未被初始化的緣由,解決方法固然是先運行server.c再運行client.c咯,這樣客戶端就能receive到服務器發來的recvBuf啦~
server.c:
do{ gets(sendBuf); send(); recv(); puts(recvBuf); }while(返回值不爲-1);
client.c:
do{ recv(); puts(recvBuf); gets(sendBuf); send(); }while(返回值不爲-1);
server.c:
// server.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Winsock2.h> #include <string.h> #pragma comment(lib,"ws2_32.lib") //添加靜態連接庫文件 void main(int argc,char* argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(1,1),&wsadata); SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //socket() /***地址結構體***/ SOCKADDR_IN addrSvr; addrSvr.sin_family=AF_INET; addrSvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSvr.sin_port=htons(6000); /**************/ bind(sockSrv,(SOCKADDR*)&addrSvr, sizeof(SOCKADDR)); //bind() listen(sockSrv,5); //listen() SOCKADDR_IN addrClient; int len= sizeof(SOCKADDR); while(1) { SOCKET socksend=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //accept() char sendBuf[50]; char recvBuf[50]; int a; do{ printf("Me:"); gets(sendBuf); fflush(stdin); send(socksend,sendBuf,strlen(sendBuf)+1,0); //send(),+1是由於字符串以'\0'結尾 a=recv(socksend,recvBuf,50,0); //recv() printf(" Client:%s\n",recvBuf); }while(a!=-1); closesocket(socksend); } closesocket(sockSrv); WSACleanup(); }
client.c:
// Client.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加靜態連接庫文件 void main(int argc,char* argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(1,1),&wsadata); SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0); // socket() /***地址結構體***/ SOCKADDR_IN addrSvr; addrSvr.sin_family=AF_INET; addrSvr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSvr.sin_port=htons(6000); /**************/ connect(socketClient,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR)); char recvBuf[50]; char sendBuf[50]; int a; do{ a=recv(socketClient,recvBuf,50,0); printf(" Server:%s\n",recvBuf); printf("Me:"); gets(sendBuf); fflush(stdin); send(socketClient,sendBuf,strlen(sendBuf)+1,0); }while(a!=1); closesocket(socketClient); WSACleanup(); }