Update syntax

This commit is contained in:
JoinedSenses
2019-11-07 14:47:40 -05:00
parent 5ef5451874
commit a7744212d2
5 changed files with 193 additions and 179 deletions
+15 -12
View File
@@ -3,7 +3,10 @@
#include <sourcemod> #include <sourcemod>
#include <socket> #include <socket>
public Plugin:myinfo = { #pragma newdecls required
#pragma semicolon 1
public Plugin myinfo = {
name = "socket example", name = "socket example",
author = "Player", author = "Player",
description = "This example demonstrates downloading a http file with the socket extension", description = "This example demonstrates downloading a http file with the socket extension",
@@ -11,33 +14,33 @@ public Plugin:myinfo = {
url = "http://www.player.to/" url = "http://www.player.to/"
}; };
public OnPluginStart() { public void OnPluginStart() {
// create a new tcp socket // create a new tcp socket
new Handle:socket = SocketCreate(SOCKET_TCP, OnSocketError); Socket socket = new Socket(SOCKET_TCP, OnSocketError);
// open a file handle for writing the result // open a file handle for writing the result
new Handle:hFile = OpenFile("dl.htm", "wb"); File hFile = OpenFile("dl.htm", "wb");
// pass the file handle to the callbacks // pass the file handle to the callbacks
SocketSetArg(socket, hFile); socket.SetArg(hFile);
// connect the socket // connect the socket
SocketConnect(socket, OnSocketConnected, OnSocketReceive, OnSocketDisconnected, "www.sourcemod.net", 80) socket.Connect(OnSocketConnected, OnSocketReceive, OnSocketDisconnected, "www.sourcemod.net", 80);
} }
public OnSocketConnected(Handle:socket, any:arg) { public void OnSocketConnected(Socket socket, any arg) {
// socket is connected, send the http request // socket is connected, send the http request
decl String:requestStr[100]; char requestStr[100];
Format(requestStr, sizeof(requestStr), "GET /%s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", "index.php", "www.sourcemod.net"); Format(requestStr, sizeof(requestStr), "GET /%s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", "index.php", "www.sourcemod.net");
SocketSend(socket, requestStr); socket.Send(requestStr);
} }
public OnSocketReceive(Handle:socket, String:receiveData[], const dataSize, any:hFile) { public void OnSocketReceive(Socket socket, char[] receiveData, const int dataSize, any hFile) {
// receive another chunk and write it to <modfolder>/dl.htm // receive another chunk and write it to <modfolder>/dl.htm
// we could strip the http response header here, but for example's sake we'll leave it in // we could strip the http response header here, but for example's sake we'll leave it in
WriteFileString(hFile, receiveData, false); WriteFileString(hFile, receiveData, false);
} }
public OnSocketDisconnected(Handle:socket, any:hFile) { public void OnSocketDisconnected(Socket socket, any hFile) {
// Connection: close advises the webserver to close the connection when the transfer is finished // Connection: close advises the webserver to close the connection when the transfer is finished
// we're done here // we're done here
@@ -45,7 +48,7 @@ public OnSocketDisconnected(Handle:socket, any:hFile) {
CloseHandle(socket); CloseHandle(socket);
} }
public OnSocketError(Handle:socket, const errorType, const errorNum, any:hFile) { public void OnSocketError(Socket socket, const int errorType, const int errorNum, any hFile) {
// a socket error occured // a socket error occured
LogError("socket error %d (errno %d)", errorType, errorNum); LogError("socket error %d (errno %d)", errorType, errorNum);
+17 -14
View File
@@ -3,7 +3,10 @@
#include <sourcemod> #include <sourcemod>
#include <socket> #include <socket>
public Plugin:myinfo = { #pragma newdecls required
#pragma semicolon 1
public Plugin myinfo = {
name = "listen socket example", name = "listen socket example",
author = "Player", author = "Player",
description = "This example provides a simple echo server", description = "This example provides a simple echo server",
@@ -11,52 +14,52 @@ public Plugin:myinfo = {
url = "http://www.player.to/" url = "http://www.player.to/"
}; };
public OnPluginStart() { public void OnPluginStart() {
// enable socket debugging (only for testing purposes!) // enable socket debugging (only for testing purposes!)
SocketSetOption(INVALID_HANDLE, DebugMode, 1); view_as<Socket>(null).SetOption(DebugMode, 1);
// create a new tcp socket // create a new tcp socket
new Handle:socket = SocketCreate(SOCKET_TCP, OnSocketError); Socket socket = new Socket(SOCKET_TCP, OnSocketError);
// bind the socket to all interfaces, port 50000 // bind the socket to all interfaces, port 50000
SocketBind(socket, "0.0.0.0", 50000); SocketBind(socket, "0.0.0.0", 50000);
// let the socket listen for incoming connections // let the socket listen for incoming connections
SocketListen(socket, OnSocketIncoming); SocketListen(socket, OnSocketIncoming);
} }
public OnSocketIncoming(Handle:socket, Handle:newSocket, String:remoteIP[], remotePort, any:arg) { public void OnSocketIncoming(Socket socket, Socket newSocket, char[] remoteIP, int remotePort, any arg) {
PrintToServer("%s:%d connected", remoteIP, remotePort); PrintToServer("%s:%d connected", remoteIP, remotePort);
// setup callbacks required to 'enable' newSocket // setup callbacks required to 'enable' newSocket
// newSocket won't process data until these callbacks are set // newSocket won't process data until these callbacks are set
SocketSetReceiveCallback(newSocket, OnChildSocketReceive); newSocket.SetReceiveCallback(OnChildSocketReceive);
SocketSetDisconnectCallback(newSocket, OnChildSocketDisconnected); newSocket.SetDisconnectCallback(OnChildSocketDisconnected);
SocketSetErrorCallback(newSocket, OnChildSocketError); newSocket.SetErrorCallback(OnChildSocketError);
SocketSend(newSocket, "send quit to quit\n"); newSocket.Send("send quit to quit\n");
} }
public OnSocketError(Handle:socket, const errorType, const errorNum, any:ary) { public void OnSocketError(Socket socket, const int errorType, const int errorNum, any arg) {
// a socket error occured // a socket error occured
LogError("socket error %d (errno %d)", errorType, errorNum); LogError("socket error %d (errno %d)", errorType, errorNum);
CloseHandle(socket); CloseHandle(socket);
} }
public OnChildSocketReceive(Handle:socket, String:receiveData[], const dataSize, any:hFile) { public void OnChildSocketReceive(Socket socket, char[] receiveData, const int dataSize, any hFile) {
// send (echo) the received data back // send (echo) the received data back
SocketSend(socket, receiveData); socket.Send(receiveData);
// close the connection/socket/handle if it matches quit // close the connection/socket/handle if it matches quit
if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket); if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket);
} }
public OnChildSocketDisconnected(Handle:socket, any:hFile) { public void OnChildSocketDisconnected(Socket socket, any hFile) {
// remote side disconnected // remote side disconnected
CloseHandle(socket); CloseHandle(socket);
} }
public OnChildSocketError(Handle:socket, const errorType, const errorNum, any:ary) { public void OnChildSocketError(Socket socket, const int errorType, const int errorNum, any ary) {
// a socket error occured // a socket error occured
LogError("child socket error %d (errno %d)", errorType, errorNum); LogError("child socket error %d (errno %d)", errorType, errorNum);
+107 -104
View File
@@ -5,7 +5,10 @@
#include <sourcemod> #include <sourcemod>
#include <socket> #include <socket>
public Plugin:myinfo = { #pragma newdecls required
#pragma semicolon 1
public Plugin myinfo = {
name = "socket extension selftest", name = "socket extension selftest",
author = "Player", author = "Player",
description = "basic functionality testing", description = "basic functionality testing",
@@ -13,15 +16,15 @@ public Plugin:myinfo = {
url = "http://www.player.to/" url = "http://www.player.to/"
}; };
new goalsReached; int g_iGoalsReached;
new trapsReached; int g_iTrapsReached;
new test; int g_iTest;
public OnGameFrame() { public void OnGameFrame() {
if (test == 0) { if (g_iTest == 0) {
test++; g_iTest++;
SocketSetOption(INVALID_HANDLE, DebugMode, 1); view_as<Socket>(null).SetOption(DebugMode, 1);
selfTest1(); selfTest1();
} }
@@ -44,25 +47,25 @@ public OnGameFrame() {
* - A socket which tries to connect to the listening socket and receives data * - A socket which tries to connect to the listening socket and receives data
* - the child socket which sends the data * - the child socket which sends the data
*/ */
selfTest1() { void selfTest1() {
goalsReached = 0; g_iGoalsReached = 0;
trapsReached = 0; g_iTrapsReached = 0;
CreateTimer(3.0, selfTest1Terminate); CreateTimer(3.0, selfTest1Terminate);
PrintToServer("* |socket selftest| test #1 running"); PrintToServer("* |socket selftest| test #1 running");
new Handle:socket = SocketCreate(SOCKET_TCP, OnSocketErrorTrap); Socket socket = new Socket(SOCKET_TCP, OnSocketErrorTrap);
SocketSetOption(socket, SocketReuseAddr, 1); socket.SetOption(SocketReuseAddr, 1);
SocketBind(socket, "0.0.0.0", 12345); socket.Bind("0.0.0.0", 12345);
SocketListen(socket, Test1_OnListenSocketIncoming); socket.Listen(Test1_OnListenSocketIncoming);
new Handle:socket2 = SocketCreate(SOCKET_TCP, OnSocketErrorTrap); Socket socket2 = new Socket(SOCKET_TCP, OnSocketErrorTrap);
SocketConnect(socket2, OnSocketConnectGoal, Test1_OnReceiveSocketReceive, Test1_OnReceiveSocketDisconnect, "127.0.0.1", 12345); socket2.Connect(OnSocketConnectGoal, Test1_OnReceiveSocketReceive, Test1_OnReceiveSocketDisconnect, "127.0.0.1", 12345);
} }
public Action:selfTest1Terminate(Handle:timer) { public Action selfTest1Terminate(Handle timer) {
if (goalsReached == 6 && trapsReached == 0) { if (g_iGoalsReached == 6 && g_iTrapsReached == 0) {
PrintToServer("* |socket selftest| ** test #1 passed **"); PrintToServer("* |socket selftest| ** test #1 passed **");
selfTest2(); selfTest2();
} else { } else {
@@ -83,26 +86,26 @@ public Action:selfTest1Terminate(Handle:timer) {
* This test is using one socket: * This test is using one socket:
* - Listening socket on port 12345 * - Listening socket on port 12345
*/ */
selfTest2() { void selfTest2() {
goalsReached = 0; g_iGoalsReached = 0;
trapsReached = 0; g_iTrapsReached = 0;
CreateTimer(4.0, selfTest2Terminate); CreateTimer(4.0, selfTest2Terminate);
PrintToServer("* |socket selftest| test #2 running"); PrintToServer("* |socket selftest| test #2 running");
new Handle:socket = SocketCreate(SOCKET_TCP, OnSocketErrorTrap); Socket socket = new Socket(SOCKET_TCP, OnSocketErrorTrap);
SocketSetOption(socket, SocketReuseAddr, 1); socket.SetOption(SocketReuseAddr, 1);
SocketBind(socket, "0.0.0.0", 12345); socket.Bind("0.0.0.0", 12345);
SocketListen(socket, OnSocketIncomingTrap); socket.Listen(OnSocketIncomingTrap);
CloseHandle(socket); CloseHandle(socket);
goalsReached++; g_iGoalsReached++;
} }
public Action:selfTest2Terminate(Handle:timer) { public Action selfTest2Terminate(Handle timer) {
if (goalsReached == 1 && trapsReached == 0) { if (g_iGoalsReached == 1 && g_iTrapsReached == 0) {
PrintToServer("* |socket selftest| ** test #2 passed **"); PrintToServer("* |socket selftest| ** test #2 passed **");
selfTest3(); selfTest3();
} else { } else {
@@ -112,29 +115,29 @@ public Action:selfTest2Terminate(Handle:timer) {
return Plugin_Stop; return Plugin_Stop;
} }
selfTest3() { void selfTest3() {
goalsReached = 0; g_iGoalsReached = 0;
trapsReached = 0; g_iTrapsReached = 0;
CreateTimer(1.0, selfTest3Terminate); CreateTimer(1.0, selfTest3Terminate);
PrintToServer("* |socket selftest| test #3 running"); PrintToServer("* |socket selftest| test #3 running");
decl Handle:socket[20]; Socket socket[20];
for (new count=1; count <= 20; count++) { for (int count = 1; count <= 20; count++) {
for (new i=0; i<count; i++) { for (int i = 0; i < count; i++) {
socket[i] = SocketCreate(SOCKET_TCP, OnSocketErrorTrap); socket[i] = new Socket(SOCKET_TCP, OnSocketErrorTrap);
} }
for (new i=0; i<count; i++) { for (int i = 0; i < count; i++) {
CloseHandle(socket[i]); CloseHandle(socket[i]);
} }
} }
goalsReached++; g_iGoalsReached++;
} }
public Action:selfTest3Terminate(Handle:timer) { public Action selfTest3Terminate(Handle timer) {
if (goalsReached == 1 && trapsReached == 0) { if (g_iGoalsReached == 1 && g_iTrapsReached == 0) {
PrintToServer("* |socket selftest| ** test #3 passed **"); PrintToServer("* |socket selftest| ** test #3 passed **");
selfTest4(); selfTest4();
} else { } else {
@@ -152,97 +155,97 @@ public Action:selfTest3Terminate(Handle:timer) {
* - connect * - connect
* - listen * - listen
*/ */
selfTest4() { void selfTest4() {
goalsReached = 0; g_iGoalsReached = 0;
trapsReached = 0; g_iTrapsReached = 0;
CreateTimer(5.0, selfTest4Terminate); CreateTimer(5.0, selfTest4Terminate);
PrintToServer("* |socket selftest| test #4 running"); PrintToServer("* |socket selftest| test #4 running");
new Handle:listenSocket = SocketCreate(SOCKET_TCP, OnSocketErrorTrap); Socket listenSocket = new Socket(SOCKET_TCP, OnSocketErrorTrap);
SocketSetOption(listenSocket, SocketReuseAddr, 1); listenSocket.SetOption(SocketReuseAddr, 1);
SocketBind(listenSocket, "0.0.0.0", 12345); listenSocket.Bind("0.0.0.0", 12345);
SocketListen(listenSocket, Test3_OnListenSocketIncoming); listenSocket.Listen(Test3_OnListenSocketIncoming);
decl Handle:socket[8]; Socket socket[8];
for (new count=1; count <= 8; count++) { for (int count = 1; count <= 8; count++) {
for (new i=0; i<count; i++) { for (int i = 0; i < count; i++) {
socket[i] = SocketCreate(SOCKET_TCP, OnSocketErrorTrap); socket[i] = new Socket(SOCKET_TCP, OnSocketErrorTrap);
} }
for (new i=0; i<count; i++) { for (int i = 0; i < count; i++) {
SocketConnect(socket[i], OnSocketConnectGoal, OnSocketReceiveTrap, OnSocketDisconnectGoal, "127.0.0.1", 12345); socket[i].Connect(OnSocketConnectGoal, OnSocketReceiveTrap, OnSocketDisconnectGoal, "127.0.0.1", 12345);
} }
} }
CloseHandle(listenSocket); CloseHandle(listenSocket);
goalsReached++; g_iGoalsReached++;
} }
public Action:selfTest4Terminate(Handle:timer) { public Action selfTest4Terminate(Handle timer) {
if (goalsReached == 109 && trapsReached == 0) { if (g_iGoalsReached == 109 && g_iTrapsReached == 0) {
PrintToServer("* |socket selftest| ** test #4 passed **"); PrintToServer("* |socket selftest| ** test #4 passed **");
selfTest5(); selfTest5();
} else { } else {
PrintToServer("* |socket selftest| ** test #4 failed ** (%d goals of 109)", goalsReached); PrintToServer("* |socket selftest| ** test #4 failed ** (%d goals of 109)", g_iGoalsReached);
} }
return Plugin_Stop; return Plugin_Stop;
} }
selfTest5() { void selfTest5() {
} }
// ------------------------------------- TEST 1 callbacks ------------------------------------- // ------------------------------------- TEST 1 callbacks -------------------------------------
public Test1_OnListenSocketIncoming(Handle:socket, Handle:newSocket, String:remoteIP[], remotePort, any:arg) { public void Test1_OnListenSocketIncoming(Socket socket, Socket newSocket, char[] remoteIP, int remotePort, any arg) {
SocketSetReceiveCallback(newSocket, OnSocketReceiveTrap); newSocket.SetReceiveCallback(OnSocketReceiveTrap);
SocketSetDisconnectCallback(newSocket, OnSocketDisconnectTrap); newSocket.SetDisconnectCallback(OnSocketDisconnectTrap);
SocketSetErrorCallback(newSocket, OnSocketErrorTrap); newSocket.SetErrorCallback(OnSocketErrorTrap);
SocketSend(newSocket, "\x00abc\x00def\x01\x02\x03\x04", 12); newSocket.Send("\x00abc\x00def\x01\x02\x03\x04", 12);
SocketSetSendqueueEmptyCallback(newSocket, Test1_OnChildSocketSQEmpty); newSocket.SetSendqueueEmptyCallback(Test1_OnChildSocketSQEmpty);
PrintToServer("* |socket selftest| goal Test1_OnListenSocketIncoming reached"); PrintToServer("* |socket selftest| goal Test1_OnListenSocketIncoming reached");
goalsReached++; g_iGoalsReached++;
// close listening socket // close listening socket
CloseHandle(socket); CloseHandle(socket);
PrintToServer("* |socket selftest| goal Test1_OnListenSocketIncoming - CloseHandle reached"); PrintToServer("* |socket selftest| goal Test1_OnListenSocketIncoming - CloseHandle reached");
goalsReached++; g_iGoalsReached++;
} }
public Test1_OnChildSocketSQEmpty(Handle:socket, any:arg) { public void Test1_OnChildSocketSQEmpty(Socket socket, any arg) {
CloseHandle(socket); CloseHandle(socket);
PrintToServer("* |socket selftest| goal Test1_OnChildSocketSQEmpty reached"); PrintToServer("* |socket selftest| goal Test1_OnChildSocketSQEmpty reached");
goalsReached++; g_iGoalsReached++;
} }
new String:recvBuffer[128]; char g_sRecvBuffer[128];
new recvBufferPos = 0; int g_iRecvBufferPos = 0;
public Test1_OnReceiveSocketReceive(Handle:socket, String:receiveData[], const dataSize, any:arg) { public void Test1_OnReceiveSocketReceive(Socket socket, char[] receiveData, const int dataSize, any arg) {
PrintToServer("received %d bytes", dataSize); PrintToServer("received %d bytes", dataSize);
if (recvBufferPos < 512) { if (g_iRecvBufferPos < 512) {
for (new i=0; i<dataSize && recvBufferPos<sizeof(recvBuffer); i++, recvBufferPos++) { for (int i = 0; i < dataSize && g_iRecvBufferPos < sizeof(g_sRecvBuffer); i++, g_iRecvBufferPos++) {
recvBuffer[recvBufferPos] = receiveData[i]; g_sRecvBuffer[g_iRecvBufferPos] = receiveData[i];
} }
} }
} }
public Test1_OnReceiveSocketDisconnect(Handle:socket, any:arg) { public void Test1_OnReceiveSocketDisconnect(Socket socket, any arg) {
PrintToServer("* |socket selftest| goal Test1_OnReceiveSocketDisconnect reached"); PrintToServer("* |socket selftest| goal Test1_OnReceiveSocketDisconnect reached");
goalsReached++; g_iGoalsReached++;
new String:cmp[] = "\x00abc\x00def\x01\x02\x03\x04"; char cmp[] = "\x00abc\x00def\x01\x02\x03\x04";
new i; int i;
for (i=0; i<recvBufferPos && i<12; i++) { for (i = 0; i < g_iRecvBufferPos && i < 12; i++) {
if (recvBuffer[i] != cmp[i]) { if (g_sRecvBuffer[i] != cmp[i]) {
PrintToServer("comparison failed"); PrintToServer("comparison failed");
break; break;
} }
@@ -252,57 +255,57 @@ public Test1_OnReceiveSocketDisconnect(Handle:socket, any:arg) {
if (i == 12) { if (i == 12) {
PrintToServer("* |socket selftest| goal Test1_OnReceiveSocketDisconnect - i=12 reached"); PrintToServer("* |socket selftest| goal Test1_OnReceiveSocketDisconnect - i=12 reached");
goalsReached++; g_iGoalsReached++;
} else { } else {
PrintToServer("* |socket selftest| trap Test1_OnReceiveSocketDisconnect - i=%d!=12 triggered", i); PrintToServer("* |socket selftest| trap Test1_OnReceiveSocketDisconnect - i=%d!=12 triggered", i);
trapsReached++; g_iTrapsReached++;
} }
} }
// ------------------------------------- TEST 3 callbacks ------------------------------------- // ------------------------------------- TEST 3 callbacks -------------------------------------
public Test3_OnListenSocketIncoming(Handle:socket, Handle:newSocket, String:remoteIP[], remotePort, any:arg) { public void Test3_OnListenSocketIncoming(Socket socket, Socket newSocket, char[] remoteIP, int remotePort, any arg) {
CloseHandle(newSocket); CloseHandle(newSocket);
goalsReached++; g_iGoalsReached++;
} }
// ------------------------------------- common callbacks ------------------------------------- // ------------------------------------- common callbacks -------------------------------------
public OnSocketConnectGoal(Handle:socket, any:arg) { public void OnSocketConnectGoal(Socket socket, any arg) {
goalsReached++; g_iGoalsReached++;
} }
public OnSocketReceiveGoal(Handle:socket, String:receiveData[], const dataSize, any:arg) { public void OnSocketReceiveGoal(Socket socket, char[] receiveData, const int dataSize, any arg) {
goalsReached++; g_iGoalsReached++;
} }
public OnSocketDisconnectGoal(Handle:socket, any:arg) { public void OnSocketDisconnectGoal(Socket socket, any arg) {
goalsReached++; g_iGoalsReached++;
} }
public OnSocketErrorGoal(Handle:socket, const errorType, const errorNum, any:arg) { public void OnSocketErrorGoal(Socket socket, const int errorType, const int errorNum, any arg) {
goalsReached++; g_iGoalsReached++;
} }
public OnSocketIncomingGoal(Handle:socket, Handle:newSocket, String:remoteIP[], remotePort, any:arg) { public void OnSocketIncomingGoal(Socket socket, Socket newSocket, char[] remoteIP, int remotePort, any arg) {
goalsReached++; g_iGoalsReached++;
} }
public OnSocketConnectTrap(Handle:socket, any:arg) { public void OnSocketConnectTrap(Socket socket, any arg) {
PrintToServer("* |socket selftest| trap OnSocketConnectTrap triggered"); PrintToServer("* |socket selftest| trap OnSocketConnectTrap triggered");
trapsReached++; g_iTrapsReached++;
} }
public OnSocketReceiveTrap(Handle:socket, String:receiveData[], const dataSize, any:arg) { public void OnSocketReceiveTrap(Socket socket, char[] receiveData, const int dataSize, any arg) {
PrintToServer("* |socket selftest| trap OnSocketReceiveTrap triggered (%d bytes received)", dataSize); PrintToServer("* |socket selftest| trap OnSocketReceiveTrap triggered (%d bytes received)", dataSize);
trapsReached++; g_iTrapsReached++;
} }
public OnSocketDisconnectTrap(Handle:socket, any:arg) { public void OnSocketDisconnectTrap(Socket socket, any arg) {
PrintToServer("* |socket selftest| trap OnSocketDisconnectTrap triggered"); PrintToServer("* |socket selftest| trap OnSocketDisconnectTrap triggered");
trapsReached++; g_iTrapsReached++;
} }
public OnSocketErrorTrap(Handle:socket, const errorType, const errorNum, any:arg) { public void OnSocketErrorTrap(Socket socket, const int errorType, const int errorNum, any arg) {
PrintToServer("* |socket selftest| trap OnSocketErrorTrap triggered (error %d, errno %d)", errorType, errorNum); PrintToServer("* |socket selftest| trap OnSocketErrorTrap triggered (error %d, errno %d)", errorType, errorNum);
trapsReached++; g_iTrapsReached++;
} }
public OnSocketIncomingTrap(Handle:socket, Handle:newSocket, String:remoteIP[], remotePort, any:arg) { public void OnSocketIncomingTrap(Socket socket, Socket newSocket, char[] remoteIP, int remotePort, any arg) {
PrintToServer("* |socket selftest| trap OnSocketIncomingTrap triggered"); PrintToServer("* |socket selftest| trap OnSocketIncomingTrap triggered");
trapsReached++; g_iTrapsReached++;
} }
// EOF // EOF
+39 -36
View File
@@ -5,7 +5,10 @@
#include <sourcemod> #include <sourcemod>
#include <socket> #include <socket>
public Plugin:myinfo = { #pragma newdecls required
#pragma semicolon 1
public Plugin myinfo = {
name = "socket extension sendto selftest", name = "socket extension sendto selftest",
author = "Player", author = "Player",
description = "basic functionality testing", description = "basic functionality testing",
@@ -13,101 +16,101 @@ public Plugin:myinfo = {
url = "http://www.player.to/" url = "http://www.player.to/"
}; };
public OnPluginStart() { public void OnPluginStart() {
SocketSetOption(INVALID_HANDLE, DebugMode, 1); view_as<Socket>(null).SetOption(DebugMode, 1);
new port = 12346; int port = 12346;
new Handle:socket = SocketCreate(SOCKET_UDP, OnLSocketError); Socket socket = new Socket(SOCKET_UDP, OnLSocketError);
SocketBind(socket, "0.0.0.0", port); socket.Bind("0.0.0.0", port);
SocketListen(socket, OnLSocketIncoming); socket.Listen(OnLSocketIncoming);
new Handle:socket2 = SocketCreate(SOCKET_UDP, OnCSocketError); Socket socket2 = new Socket(SOCKET_UDP, OnCSocketError);
//SocketConnect(socket2, OnCSocketConnect, OnCSocketReceive, OnCSocketDisconnect, "127.0.0.1", port); //SocketConnect(socket2, OnCSocketConnect, OnCSocketReceive, OnCSocketDisconnect, "127.0.0.1", port);
} }
public OnLSocketIncoming(Handle:socket, Handle:newSocket, String:remoteIP[], remotePort, any:arg) { public void OnLSocketIncoming(Socket socket, Socket newSocket, char[] remoteIP, int remotePort, any arg) {
PrintToServer("%s:%d connected", remoteIP, remotePort); PrintToServer("%s:%d connected", remoteIP, remotePort);
SocketSetReceiveCallback(newSocket, OnChildSocketReceive); newSocket.SetReceiveCallback(OnChildSocketReceive);
SocketSetDisconnectCallback(newSocket, OnChildSocketDisconnect); newSocket.SetDisconnectCallback(OnChildSocketDisconnect);
SocketSetErrorCallback(newSocket, OnChildSocketError); newSocket.SetErrorCallback(OnChildSocketError);
SocketSend(newSocket, "\x00abc\x00def\x01\x02\x03\x04", 12); newSocket.Send("\x00abc\x00def\x01\x02\x03\x04", 12);
SocketSetSendqueueEmptyCallback(newSocket, OnChildSocketSQEmpty); newSocket.SetSendqueueEmptyCallback(OnChildSocketSQEmpty);
} }
public OnLSocketError(Handle:socket, const errorType, const errorNum, any:arg) { public void OnLSocketError(Socket socket, const int errorType, const int errorNum, any arg) {
LogError("listen socket error %d (errno %d)", errorType, errorNum); LogError("listen socket error %d (errno %d)", errorType, errorNum);
CloseHandle(socket); CloseHandle(socket);
} }
public OnChildSocketReceive(Handle:socket, String:receiveData[], const dataSize, any:arg) { public void OnChildSocketReceive(Socket socket, char[] receiveData, const int dataSize, any arg) {
// send (echo) the received data back // send (echo) the received data back
//SocketSend(socket, receiveData); //socket.Send(receiveData);
// close the connection/socket/handle if it matches quit // close the connection/socket/handle if it matches quit
//if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket); //if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket);
} }
public OnChildSocketSQEmpty(Handle:socket, any:arg) { public void OnChildSocketSQEmpty(Socket socket, any arg) {
PrintToServer("sq empty"); PrintToServer("sq empty");
CloseHandle(socket); CloseHandle(socket);
} }
public OnChildSocketDisconnect(Handle:socket, any:arg) { public void OnChildSocketDisconnect(Socket socket, any arg) {
// remote side disconnected // remote side disconnected
PrintToServer("disc"); PrintToServer("disc");
CloseHandle(socket); CloseHandle(socket);
} }
public OnChildSocketError(Handle:socket, const errorType, const errorNum, any:arg) { public void OnChildSocketError(Socket socket, const int errorType, const int errorNum, any arg) {
// a socket error occured // a socket error occured
LogError("child socket error %d (errno %d)", errorType, errorNum); LogError("child socket error %d (errno %d)", errorType, errorNum);
CloseHandle(socket); CloseHandle(socket);
} }
public OnCSocketConnect(Handle:socket, any:arg) { public void OnCSocketConnect(Socket socket, any arg) {
// send (echo) the received data back // send (echo) the received data back
//SocketSend(socket, receiveData); //socket.Send(receiveData);
// close the connection/socket/handle if it matches quit // close the connection/socket/handle if it matches quit
//if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket); //if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket);
} }
new String:recvBuffer[128]; char g_sRecvBuffer[128];
new recvBufferPos = 0; int g_irecvBufferPos = 0;
public OnCSocketReceive(Handle:socket, String:receiveData[], const dataSize, any:arg) { public void OnCSocketReceive(Socket socket, char[] receiveData, const int dataSize, any arg) {
PrintToServer("received %d bytes", dataSize); PrintToServer("received %d bytes", dataSize);
if (recvBufferPos < 512) { if (g_irecvBufferPos < 512) {
for (new i=0; i<dataSize && recvBufferPos<sizeof(recvBuffer); i++, recvBufferPos++) { for (int i = 0; i < dataSize && g_irecvBufferPos < sizeof(g_sRecvBuffer); i++, g_irecvBufferPos++) {
recvBuffer[recvBufferPos] = receiveData[i]; g_sRecvBuffer[g_irecvBufferPos] = receiveData[i];
} }
} }
// send (echo) the received data back // send (echo) the received data back
//SocketSend(socket, receiveData); //socket.Send(receiveData);
// close the connection/socket/handle if it matches quit // close the connection/socket/handle if it matches quit
//if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket); //if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket);
} }
public OnCSocketDisconnect(Handle:socket, any:arg) { public void OnCSocketDisconnect(Socket socket, any arg) {
new String:cmp[] = "\x00abc\x00def\x01\x02\x03\x04"; char[] cmp = "\x00abc\x00def\x01\x02\x03\x04";
new i; int i;
for (i=0; i<recvBufferPos && i<12; i++) { for (i = 0; i < g_irecvBufferPos && i < 12; i++) {
if (recvBuffer[i] != cmp[i]) { if (g_sRecvBuffer[i] != cmp[i]) {
PrintToServer("comparison failed"); PrintToServer("comparison failed");
break; break;
} }
} }
PrintToServer("comparison finished at pos %d/%d", i, recvBufferPos); PrintToServer("comparison finished at pos %d/%d", i, g_irecvBufferPos);
CloseHandle(socket); CloseHandle(socket);
} }
public OnCSocketError(Handle:socket, const errorType, const errorNum, any:arg) { public void OnCSocketError(Socket socket, const int errorType, const int errorNum, any arg) {
// a socket error occured // a socket error occured
LogError("connect socket error %d (errno %d)", errorType, errorNum); LogError("connect socket error %d (errno %d)", errorType, errorNum);
+15 -13
View File
@@ -1,12 +1,14 @@
// http://forums.alliedmods.net/showpost.php?p=717597&postcount=67 // http://forums.alliedmods.net/showpost.php?p=717597&postcount=67
#pragma semicolon 1
#include <sourcemod> #include <sourcemod>
#include <socket> #include <socket>
#pragma newdecls required
#pragma semicolon 1
#define PLUGIN_VERSION "1.0.0" #define PLUGIN_VERSION "1.0.0"
public Plugin:myinfo = public Plugin myinfo =
{ {
name = "Socket Test", name = "Socket Test",
author = "Unknown", author = "Unknown",
@@ -15,42 +17,42 @@ public Plugin:myinfo =
url = "" url = ""
} }
public OnPluginStart() public void OnPluginStart()
{ {
SocketSetOption(INVALID_HANDLE,DebugMode,1); view_as<Socket>(null).SetOption(DebugMode,1);
RegAdminCmd("sm_socket_test", CommandTest, ADMFLAG_CONVARS, "test"); RegAdminCmd("sm_socket_test", CommandTest, ADMFLAG_CONVARS, "test");
} }
public Action:CommandTest(client, args) public Action CommandTest(int client, int args)
{ {
// create a new tcp socket // create a new tcp socket
new Handle:socket = SocketCreate(SOCKET_TCP, OnSocketError); Socket socket = new Socket(SOCKET_TCP, OnSocketError);
// open a file handle for writing the result // open a file handle for writing the result
//new Handle:hFile = OpenFile("dl.htm", "wb"); //new Socket hFile = OpenFile("dl.htm", "wb");
// pass the file handle to the callbacks // pass the file handle to the callbacks
//SocketSetArg(socket, hFile); //SocketSetArg(socket, hFile);
// connect the socket // connect the socket
SocketConnect(socket, OnSocketConnected, OnSocketReceive, OnSocketDisconnected, "www.sourcemod.net", 80); socket.Connect(OnSocketConnected, OnSocketReceive, OnSocketDisconnected, "www.sourcemod.net", 80);
return Plugin_Handled; return Plugin_Handled;
} }
public OnSocketConnected(Handle:socket, any:hFile) { public void OnSocketConnected(Socket socket, any hFile) {
// socket is connected, send the http request // socket is connected, send the http request
decl String:requestStr[100]; char requestStr[100];
Format(requestStr, sizeof(requestStr), "GET /%s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", "index.php", "www.sourcemod.net"); Format(requestStr, sizeof(requestStr), "GET /%s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", "index.php", "www.sourcemod.net");
SocketSend(socket, requestStr); SocketSend(socket, requestStr);
} }
public OnSocketReceive(Handle:socket, String:receiveData[], const dataSize, any:hFile) { public void OnSocketReceive(Socket socket, char[] receiveData, const int dataSize, any hFile) {
// receive another chunk and write it to <modfolder>/dl.htm // receive another chunk and write it to <modfolder>/dl.htm
// we could strip the http response header here, but for example's sake we'll leave it in // we could strip the http response header here, but for example's sake we'll leave it in
//WriteFileString(hFile, receiveData, false); //WriteFileString(hFile, receiveData, false);
} }
public OnSocketDisconnected(Handle:socket, any:hFile) { public void OnSocketDisconnected(Socket socket, any hFile) {
// Connection: close advises the webserver to close the connection when the transfer is finished // Connection: close advises the webserver to close the connection when the transfer is finished
// we're done here // we're done here
@@ -58,7 +60,7 @@ public OnSocketDisconnected(Handle:socket, any:hFile) {
CloseHandle(socket); CloseHandle(socket);
} }
public OnSocketError(Handle:socket, const errorType, const errorNum, any:hFile) { public void OnSocketError(Socket socket, const int errorType, const int errorNum, any hFile) {
// a socket error occured // a socket error occured
LogError("socket error %d (errno %d)", errorType, errorNum); LogError("socket error %d (errno %d)", errorType, errorNum);